summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Morman <jmorman@perspectalabs.com>2021-03-15 12:12:22 -0400
committermormj <34754695+mormj@users.noreply.github.com>2021-03-16 09:18:25 -0400
commitaabde1fc4611906b951951b7b62f3c2d51fede37 (patch)
treea62ec6f9a05beedf13a2d376b2dbbbd9901b337b
parent6a07bc3a829efa5912c31e01d8c1054b61d98b0b (diff)
dtv/atsc: create separate plinfo stream ports
Rather than adding/searching for tags, just put plinfo on its own streaming port. This should be more efficient than putting tags on every item. Signed-off-by: Josh Morman <jmorman@perspectalabs.com>
-rw-r--r--gr-dtv/grc/dtv_atsc_deinterleaver.block.yml8
-rw-r--r--gr-dtv/grc/dtv_atsc_derandomizer.block.yml6
-rw-r--r--gr-dtv/grc/dtv_atsc_equalizer.block.yml8
-rw-r--r--gr-dtv/grc/dtv_atsc_fs_checker.block.yml5
-rw-r--r--gr-dtv/grc/dtv_atsc_rs_decoder.block.yml8
-rw-r--r--gr-dtv/grc/dtv_atsc_viterbi_decoder.block.yml8
-rw-r--r--gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc33
-rw-r--r--gr-dtv/lib/atsc/atsc_derandomizer_impl.cc20
-rw-r--r--gr-dtv/lib/atsc/atsc_equalizer_impl.cc42
-rw-r--r--gr-dtv/lib/atsc/atsc_equalizer_impl.h2
-rw-r--r--gr-dtv/lib/atsc/atsc_fs_checker_impl.cc18
-rw-r--r--gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc31
-rw-r--r--gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc30
13 files changed, 96 insertions, 123 deletions
diff --git a/gr-dtv/grc/dtv_atsc_deinterleaver.block.yml b/gr-dtv/grc/dtv_atsc_deinterleaver.block.yml
index 7628bc8bc2..de1febe8ab 100644
--- a/gr-dtv/grc/dtv_atsc_deinterleaver.block.yml
+++ b/gr-dtv/grc/dtv_atsc_deinterleaver.block.yml
@@ -6,11 +6,19 @@ inputs:
- domain: stream
dtype: byte
vlen: 207
+- domain: stream
+ label: plinfo
+ dtype: short
+ vlen: 2
outputs:
- domain: stream
dtype: byte
vlen: 207
+- domain: stream
+ label: plinfo
+ dtype: short
+ vlen: 2
templates:
imports: from gnuradio import dtv
diff --git a/gr-dtv/grc/dtv_atsc_derandomizer.block.yml b/gr-dtv/grc/dtv_atsc_derandomizer.block.yml
index 3329965030..4949e8329d 100644
--- a/gr-dtv/grc/dtv_atsc_derandomizer.block.yml
+++ b/gr-dtv/grc/dtv_atsc_derandomizer.block.yml
@@ -6,7 +6,11 @@ inputs:
- domain: stream
dtype: byte
vlen: 188
-
+- domain: stream
+ label: plinfo
+ dtype: short
+ vlen: 2
+
outputs:
- domain: stream
dtype: byte
diff --git a/gr-dtv/grc/dtv_atsc_equalizer.block.yml b/gr-dtv/grc/dtv_atsc_equalizer.block.yml
index 3d55d85af7..b299f1e3b4 100644
--- a/gr-dtv/grc/dtv_atsc_equalizer.block.yml
+++ b/gr-dtv/grc/dtv_atsc_equalizer.block.yml
@@ -6,11 +6,19 @@ inputs:
- domain: stream
dtype: float
vlen: 832
+- domain: stream
+ label: plinfo
+ dtype: short
+ vlen: 2
outputs:
- domain: stream
dtype: float
vlen: 832
+- domain: stream
+ label: plinfo
+ dtype: short
+ vlen: 2
templates:
imports: from gnuradio import dtv
diff --git a/gr-dtv/grc/dtv_atsc_fs_checker.block.yml b/gr-dtv/grc/dtv_atsc_fs_checker.block.yml
index 098a440382..f8de6b9aa8 100644
--- a/gr-dtv/grc/dtv_atsc_fs_checker.block.yml
+++ b/gr-dtv/grc/dtv_atsc_fs_checker.block.yml
@@ -12,6 +12,11 @@ outputs:
dtype: float
vlen: 832
+- domain: stream
+ label: plinfo
+ dtype: short
+ vlen: 2
+
templates:
imports: from gnuradio import dtv
make: dtv.atsc_fs_checker()
diff --git a/gr-dtv/grc/dtv_atsc_rs_decoder.block.yml b/gr-dtv/grc/dtv_atsc_rs_decoder.block.yml
index 08bb639339..7f43752ade 100644
--- a/gr-dtv/grc/dtv_atsc_rs_decoder.block.yml
+++ b/gr-dtv/grc/dtv_atsc_rs_decoder.block.yml
@@ -6,11 +6,19 @@ inputs:
- domain: stream
dtype: byte
vlen: 207
+- domain: stream
+ label: plinfo
+ dtype: short
+ vlen: 2
outputs:
- domain: stream
dtype: byte
vlen: 188
+- domain: stream
+ label: plinfo
+ dtype: short
+ vlen: 2
templates:
imports: from gnuradio import dtv
diff --git a/gr-dtv/grc/dtv_atsc_viterbi_decoder.block.yml b/gr-dtv/grc/dtv_atsc_viterbi_decoder.block.yml
index 199560c925..27a7f08d18 100644
--- a/gr-dtv/grc/dtv_atsc_viterbi_decoder.block.yml
+++ b/gr-dtv/grc/dtv_atsc_viterbi_decoder.block.yml
@@ -6,11 +6,19 @@ inputs:
- domain: stream
dtype: float
vlen: 832
+- domain: stream
+ label: plinfo
+ dtype: short
+ vlen: 2
outputs:
- domain: stream
dtype: byte
vlen: 207
+- domain: stream
+ label: plinfo
+ dtype: short
+ vlen: 2
templates:
imports: from gnuradio import dtv
diff --git a/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc b/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc
index d83d0a625f..df4ad5c2c0 100644
--- a/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_deinterleaver_impl.cc
@@ -27,8 +27,10 @@ atsc_deinterleaver::sptr atsc_deinterleaver::make()
atsc_deinterleaver_impl::atsc_deinterleaver_impl()
: 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))),
+ io_signature::make2(
+ 2, 2, ATSC_MPEG_RS_ENCODED_LENGTH * sizeof(uint8_t), sizeof(plinfo)),
+ io_signature::make2(
+ 2, 2, ATSC_MPEG_RS_ENCODED_LENGTH * sizeof(uint8_t), sizeof(plinfo))),
alignment_fifo(156)
{
m_fifo.reserve(s_interleavers);
@@ -37,8 +39,6 @@ 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() {}
@@ -57,31 +57,20 @@ int atsc_deinterleaver_impl::work(int noutput_items,
{
auto in = static_cast<const uint8_t*>(input_items[0]);
auto out = static_cast<uint8_t*>(output_items[0]);
+ auto plin = static_cast<const plinfo*>(input_items[1]);
+ auto plout = static_cast<plinfo*>(output_items[1]);
- 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 Deinterleaver: Plinfo Tag not found on sample");
- }
- assert(pli_in.regular_seg_p());
+ for (int i = 0; i < noutput_items; i++) {
+ assert(plin[i].regular_seg_p());
// reset commutator if required using INPUT pipeline info
- if (pli_in.first_regular_seg_p())
+ if (plin[i].first_regular_seg_p())
sync();
// remap OUTPUT pipeline info to reflect all data segment end-to-end delay
- 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()));
+ plout[i] = plinfo();
+ plinfo::delay(plout[i], plin[i], s_interleavers);
// now do the actual deinterleaving
for (unsigned int j = 0; j < ATSC_MPEG_RS_ENCODED_LENGTH; j++) {
diff --git a/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc b/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc
index 33dcf47600..b7f654a507 100644
--- a/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_derandomizer_impl.cc
@@ -26,11 +26,11 @@ atsc_derandomizer::sptr atsc_derandomizer::make()
atsc_derandomizer_impl::atsc_derandomizer_impl()
: gr::sync_block("dtv_atsc_derandomizer",
- io_signature::make(1, 1, ATSC_MPEG_PKT_LENGTH * sizeof(uint8_t)),
+ io_signature::make2(
+ 2, 2, ATSC_MPEG_PKT_LENGTH * sizeof(uint8_t), sizeof(plinfo)),
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,
@@ -39,20 +39,12 @@ int atsc_derandomizer_impl::work(int noutput_items,
{
auto in = static_cast<const uint8_t*>(input_items[0]);
auto out = static_cast<uint8_t*>(output_items[0]);
+ auto plin = static_cast<const plinfo*>(input_items[1]);
- 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(plin[i].regular_seg_p());
- if (pli_in.first_regular_seg_p())
+ if (plin[i].first_regular_seg_p())
d_rand.reset();
d_rand.derandomize(&out[i * ATSC_MPEG_PKT_LENGTH], &in[i * ATSC_MPEG_PKT_LENGTH]);
@@ -60,7 +52,7 @@ int atsc_derandomizer_impl::work(int noutput_items,
// Check the pipeline info for error status and and set the
// corresponding bit in transport packet header.
- if (pli_in.transport_error_p())
+ if (plin[i].transport_error_p())
out[i * ATSC_MPEG_PKT_LENGTH + 1] |= MPEG_TRANSPORT_ERROR_BIT;
else
out[i * ATSC_MPEG_PKT_LENGTH + 1] &= ~MPEG_TRANSPORT_ERROR_BIT;
diff --git a/gr-dtv/lib/atsc/atsc_equalizer_impl.cc b/gr-dtv/lib/atsc/atsc_equalizer_impl.cc
index 5970fb5d63..ae9c5f971c 100644
--- a/gr-dtv/lib/atsc/atsc_equalizer_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_equalizer_impl.cc
@@ -17,6 +17,7 @@
#include "atsc_types.h"
#include <gnuradio/io_signature.h>
#include <volk/volk.h>
+#include <fstream>
namespace gr {
namespace dtv {
@@ -52,20 +53,18 @@ static void init_field_sync_common(float* p, int mask)
atsc_equalizer_impl::atsc_equalizer_impl()
: gr::block("dtv_atsc_equalizer",
- io_signature::make(1, 1, ATSC_DATA_SEGMENT_LENGTH * sizeof(float)),
- io_signature::make(1, 1, ATSC_DATA_SEGMENT_LENGTH * sizeof(float)))
+ io_signature::make2(
+ 2, 2, ATSC_DATA_SEGMENT_LENGTH * sizeof(float), sizeof(plinfo)),
+ io_signature::make2(
+ 2, 2, ATSC_DATA_SEGMENT_LENGTH * sizeof(float), sizeof(plinfo)))
{
init_field_sync_common(training_sequence1, 0);
init_field_sync_common(training_sequence2, 1);
d_taps.resize(NTAPS, 0.0f);
- d_buff_not_filled = true;
-
const int alignment_multiple = volk_get_alignment() / sizeof(float);
set_alignment(std::max(1, alignment_multiple));
-
- set_tag_propagation_policy(TPP_CUSTOM); // use manual tag propagation
}
atsc_equalizer_impl::~atsc_equalizer_impl() {}
@@ -118,12 +117,13 @@ int atsc_equalizer_impl::general_work(int noutput_items,
{
auto in = static_cast<const float*>(input_items[0]);
auto out = static_cast<float*>(output_items[0]);
+ auto in_pl = static_cast<const plinfo*>(input_items[1]);
+ auto out_pl = static_cast<plinfo*>(output_items[1]);
int output_produced = 0;
int i = 0;
std::vector<tag_t> tags;
- auto tag_pmt = pmt::intern("plinfo");
plinfo pli_in;
if (d_buff_not_filled) {
@@ -131,14 +131,9 @@ int atsc_equalizer_impl::general_work(int noutput_items,
memcpy(&data_mem[NPRETAPS],
in + i * ATSC_DATA_SEGMENT_LENGTH,
ATSC_DATA_SEGMENT_LENGTH * sizeof(float));
- get_tags_in_window(tags, 0, 0, 1, tag_pmt);
- if (tags.size() > 0) {
- pli_in.from_tag_value(pmt::to_uint64(tags[0].value));
- d_flags = pli_in.flags();
- d_segno = pli_in.segno();
- } else {
- throw std::runtime_error("Atsc Equalizer: Plinfo Tag not found on sample");
- }
+
+ d_flags = in_pl[i].flags();
+ d_segno = in_pl[i].segno();
d_buff_not_filled = false;
i++;
@@ -164,12 +159,7 @@ int atsc_equalizer_impl::general_work(int noutput_items,
ATSC_DATA_SEGMENT_LENGTH * sizeof(float));
plinfo pli_out(d_flags, d_segno);
- add_item_tag(0,
- nitems_written(0) + output_produced,
- tag_pmt,
- pmt::from_uint64(pli_out.get_tag_value()));
-
- output_produced++;
+ out_pl[output_produced++] = pli_out;
}
memcpy(data_mem, &data_mem[ATSC_DATA_SEGMENT_LENGTH], NPRETAPS * sizeof(float));
@@ -177,14 +167,8 @@ int atsc_equalizer_impl::general_work(int noutput_items,
in + i * ATSC_DATA_SEGMENT_LENGTH,
ATSC_DATA_SEGMENT_LENGTH * sizeof(float));
- 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));
- d_flags = pli_in.flags();
- d_segno = pli_in.segno();
- } else {
- throw std::runtime_error("Atsc Equalizer: Plinfo Tag not found on sample");
- }
+ d_flags = in_pl[i].flags();
+ d_segno = in_pl[i].segno();
}
consume_each(noutput_items);
diff --git a/gr-dtv/lib/atsc/atsc_equalizer_impl.h b/gr-dtv/lib/atsc/atsc_equalizer_impl.h
index bf41351807..7977dbe20e 100644
--- a/gr-dtv/lib/atsc/atsc_equalizer_impl.h
+++ b/gr-dtv/lib/atsc/atsc_equalizer_impl.h
@@ -44,7 +44,7 @@ private:
unsigned short d_flags;
short d_segno;
- bool d_buff_not_filled;
+ bool d_buff_not_filled = true;
public:
atsc_equalizer_impl();
diff --git a/gr-dtv/lib/atsc/atsc_fs_checker_impl.cc b/gr-dtv/lib/atsc/atsc_fs_checker_impl.cc
index cf00be36ee..82d15a8814 100644
--- a/gr-dtv/lib/atsc/atsc_fs_checker_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_fs_checker_impl.cc
@@ -36,9 +36,9 @@ atsc_fs_checker::sptr atsc_fs_checker::make()
atsc_fs_checker_impl::atsc_fs_checker_impl()
: gr::block("dtv_atsc_fs_checker",
io_signature::make(1, 1, ATSC_DATA_SEGMENT_LENGTH * sizeof(float)),
- io_signature::make(1, 1, ATSC_DATA_SEGMENT_LENGTH * sizeof(float)))
+ io_signature::make2(
+ 2, 2, ATSC_DATA_SEGMENT_LENGTH * sizeof(float), sizeof(plinfo)))
{
- gr::configure_default_loggers(d_logger, d_debug_logger, "dtv_atsc_fs_checker");
reset();
}
@@ -59,13 +59,12 @@ int atsc_fs_checker_impl::general_work(int noutput_items,
gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items)
{
- const float* in = static_cast<const float*>(input_items[0]);
- float* out = static_cast<float*>(output_items[0]);
+ auto in = static_cast<const float*>(input_items[0]);
+ auto out = static_cast<float*>(output_items[0]);
+ auto out_pl = static_cast<plinfo*>(output_items[1]);
int output_produced = 0;
- auto tag_pmt = pmt::intern("plinfo");
-
for (int i = 0; i < noutput_items; i++) {
// check for a hit on the PN 511 pattern
int errors = 0;
@@ -114,12 +113,7 @@ int atsc_fs_checker_impl::general_work(int noutput_items,
d_field_num = 0;
d_segment_num = 0;
} else {
- add_item_tag(0,
- nitems_written(0) + output_produced,
- tag_pmt,
- pmt::from_uint64(pli_out.get_tag_value()));
-
- output_produced++;
+ out_pl[output_produced++] = pli_out;
}
}
}
diff --git a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc
index 4e6afe2753..9220783b48 100644
--- a/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_rs_decoder_impl.cc
@@ -37,8 +37,10 @@ atsc_rs_decoder::sptr atsc_rs_decoder::make()
atsc_rs_decoder_impl::atsc_rs_decoder_impl()
: gr::sync_block(
"dtv_atsc_rs_decoder",
- io_signature::make(1, 1, sizeof(uint8_t) * ATSC_MPEG_RS_ENCODED_LENGTH),
- io_signature::make(1, 1, sizeof(uint8_t) * ATSC_MPEG_PKT_LENGTH))
+ io_signature::make2(
+ 2, 2, sizeof(uint8_t) * ATSC_MPEG_RS_ENCODED_LENGTH, sizeof(plinfo)),
+ io_signature::make2(
+ 2, 2, sizeof(uint8_t) * ATSC_MPEG_PKT_LENGTH, sizeof(plinfo)))
{
d_rs = init_rs_char(
rs_init_symsize, rs_init_gfpoly, rs_init_fcr, rs_init_prim, rs_init_nroots);
@@ -46,8 +48,6 @@ atsc_rs_decoder_impl::atsc_rs_decoder_impl()
d_nerrors_corrected_count = 0;
d_bad_packet_count = 0;
d_total_packets = 0;
-
- set_tag_propagation_policy(TPP_CUSTOM);
}
int atsc_rs_decoder_impl::decode(uint8_t* out, const uint8_t* in)
@@ -93,27 +93,17 @@ int atsc_rs_decoder_impl::work(int noutput_items,
{
auto in = static_cast<const uint8_t*>(input_items[0]);
auto out = static_cast<uint8_t*>(output_items[0]);
+ auto plin = static_cast<const plinfo*>(input_items[1]);
+ auto plout = static_cast<plinfo*>(output_items[1]);
- 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 Viterbi Decoder: Plinfo Tag not found on sample");
- }
-
- assert(pli_in.regular_seg_p());
-
- plinfo pli_out = pli_in; // copy pipeline info...
+ assert(plin[i].regular_seg_p());
+ plout[i] = plin[i]; // copy pipeline info...
int nerrors_corrected =
decode(&out[i * ATSC_MPEG_PKT_LENGTH], &in[i * ATSC_MPEG_RS_ENCODED_LENGTH]);
- pli_out.set_transport_error(nerrors_corrected == -1);
+ plout[i].set_transport_error(nerrors_corrected == -1);
if (nerrors_corrected == -1) {
d_bad_packet_count++;
d_nerrors_corrected_count += 10; // lower bound estimate; most this RS can fix
@@ -121,9 +111,6 @@ int atsc_rs_decoder_impl::work(int noutput_items,
d_nerrors_corrected_count += nerrors_corrected;
}
- add_item_tag(
- 0, nitems_written(0) + i, tag_pmt, pmt::from_uint64(pli_out.get_tag_value()));
-
d_total_packets++;
#if 0
if (d_total_packets > 1000) {
diff --git a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc
index 5b807f3fce..0219379323 100644
--- a/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_viterbi_decoder_impl.cc
@@ -28,8 +28,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(float) * ATSC_DATA_SEGMENT_LENGTH),
- io_signature::make(1, 1, sizeof(unsigned char) * ATSC_MPEG_RS_ENCODED_LENGTH))
+ io_signature::make2(
+ 2, 2, sizeof(float) * ATSC_DATA_SEGMENT_LENGTH, sizeof(plinfo)),
+ io_signature::make2(
+ 2, 2, sizeof(unsigned char) * ATSC_MPEG_RS_ENCODED_LENGTH, sizeof(plinfo)))
{
set_output_multiple(NCODERS);
@@ -50,8 +52,6 @@ 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() {}
@@ -76,6 +76,8 @@ int atsc_viterbi_decoder_impl::work(int noutput_items,
{
auto in = static_cast<const float*>(input_items[0]);
auto out = static_cast<unsigned char*>(output_items[0]);
+ auto plin = static_cast<const plinfo*>(input_items[1]);
+ auto plout = static_cast<plinfo*>(output_items[1]);
// The way the fs_checker works ensures we start getting packets
// starting with a field sync, and out input multiple is set to
@@ -91,9 +93,7 @@ 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++)
@@ -102,7 +102,6 @@ int atsc_viterbi_decoder_impl::work(int noutput_items,
ATSC_DATA_SEGMENT_LENGTH +
enco_which_syms[encoder][k] % ATSC_DATA_SEGMENT_LENGTH];
-
/* Now run each of the 12 Viterbi decoders over their subset of
the input symbols */
for (unsigned int encoder = 0; encoder < NCODERS; encoder++)
@@ -123,26 +122,13 @@ 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++) {
- 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 + j) * ATSC_MPEG_RS_ENCODED_LENGTH],
&out_copy[j * ATSC_MPEG_RS_ENCODED_LENGTH],
ATSC_MPEG_RS_ENCODED_LENGTH * sizeof(out_copy[0]));
- plinfo pli_out;
+ plout[i + j] = plinfo();
// adjust pipeline info to reflect 12 segment delay
- 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()));
+ plinfo::delay(plout[i + j], plin[i + j], NCODERS);
}
}