summaryrefslogtreecommitdiff
path: root/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-dtv/lib/atsc/atsc_derandomizer_impl.cc')
-rw-r--r--gr-dtv/lib/atsc/atsc_derandomizer_impl.cc31
1 files changed, 20 insertions, 11 deletions
diff --git a/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc b/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc
index 2b102838f0..33dcf47600 100644
--- a/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc
@@ -26,35 +26,44 @@ atsc_derandomizer::sptr atsc_derandomizer::make()
atsc_derandomizer_impl::atsc_derandomizer_impl()
: gr::sync_block("dtv_atsc_derandomizer",
- io_signature::make(1, 1, sizeof(atsc_mpeg_packet_no_sync)),
- io_signature::make(1, 1, sizeof(atsc_mpeg_packet)))
+ io_signature::make(1, 1, ATSC_MPEG_PKT_LENGTH * sizeof(uint8_t)),
+ 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,
gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items)
{
- const atsc_mpeg_packet_no_sync* in = (const atsc_mpeg_packet_no_sync*)input_items[0];
- atsc_mpeg_packet* out = (atsc_mpeg_packet*)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++) {
+ 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(in[i].pli.regular_seg_p());
-
- if (in[i].pli.first_regular_seg_p())
+ if (pli_in.first_regular_seg_p())
d_rand.reset();
- d_rand.derandomize(out[i], in[i]);
+ d_rand.derandomize(&out[i * ATSC_MPEG_PKT_LENGTH], &in[i * ATSC_MPEG_PKT_LENGTH]);
// Check the pipeline info for error status and and set the
// corresponding bit in transport packet header.
- if (in[i].pli.transport_error_p())
- out[i].data[1] |= MPEG_TRANSPORT_ERROR_BIT;
+ if (pli_in.transport_error_p())
+ out[i * ATSC_MPEG_PKT_LENGTH + 1] |= MPEG_TRANSPORT_ERROR_BIT;
else
- out[i].data[1] &= ~MPEG_TRANSPORT_ERROR_BIT;
+ out[i * ATSC_MPEG_PKT_LENGTH + 1] &= ~MPEG_TRANSPORT_ERROR_BIT;
}
return noutput_items;