diff options
Diffstat (limited to 'gr-dtv/lib/atsc/atsc_derandomizer_impl.cc')
-rw-r--r-- | gr-dtv/lib/atsc/atsc_derandomizer_impl.cc | 31 |
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; |