summaryrefslogtreecommitdiff
path: root/gr-dtv/lib/atsc/atsc_equalizer_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-dtv/lib/atsc/atsc_equalizer_impl.cc')
-rw-r--r--gr-dtv/lib/atsc/atsc_equalizer_impl.cc61
1 files changed, 42 insertions, 19 deletions
diff --git a/gr-dtv/lib/atsc/atsc_equalizer_impl.cc b/gr-dtv/lib/atsc/atsc_equalizer_impl.cc
index 6c701d607b..5970fb5d63 100644
--- a/gr-dtv/lib/atsc/atsc_equalizer_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_equalizer_impl.cc
@@ -52,8 +52,8 @@ 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, sizeof(atsc_soft_data_segment)),
- io_signature::make(1, 1, sizeof(atsc_soft_data_segment)))
+ io_signature::make(1, 1, ATSC_DATA_SEGMENT_LENGTH * sizeof(float)),
+ io_signature::make(1, 1, ATSC_DATA_SEGMENT_LENGTH * sizeof(float)))
{
init_field_sync_common(training_sequence1, 0);
init_field_sync_common(training_sequence2, 1);
@@ -64,6 +64,8 @@ atsc_equalizer_impl::atsc_equalizer_impl()
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() {}
@@ -114,17 +116,30 @@ int atsc_equalizer_impl::general_work(int noutput_items,
gr_vector_const_void_star& input_items,
gr_vector_void_star& output_items)
{
- const atsc_soft_data_segment* in = (const atsc_soft_data_segment*)input_items[0];
- atsc_soft_data_segment* out = (atsc_soft_data_segment*)output_items[0];
+ auto in = static_cast<const float*>(input_items[0]);
+ auto out = static_cast<float*>(output_items[0]);
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) {
memset(&data_mem[0], 0, NPRETAPS * sizeof(float));
- memcpy(&data_mem[NPRETAPS], in[i].data, ATSC_DATA_SEGMENT_LENGTH * sizeof(float));
- d_flags = in[i].pli._flags;
- d_segno = in[i].pli._segno;
+ 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_buff_not_filled = false;
i++;
}
@@ -132,36 +147,44 @@ int atsc_equalizer_impl::general_work(int noutput_items,
for (; i < noutput_items; i++) {
memcpy(&data_mem[ATSC_DATA_SEGMENT_LENGTH + NPRETAPS],
- in[i].data,
+ in + i * ATSC_DATA_SEGMENT_LENGTH,
(NTAPS - NPRETAPS) * sizeof(float));
if (d_segno == -1) {
if (d_flags & 0x0010) {
adaptN(data_mem, training_sequence2, data_mem2, KNOWN_FIELD_SYNC_LENGTH);
- // filterN(&data_mem[KNOWN_FIELD_SYNC_LENGTH], data_mem2,
- // ATSC_DATA_SEGMENT_LENGTH - KNOWN_FIELD_SYNC_LENGTH);
} else if (!(d_flags & 0x0010)) {
adaptN(data_mem, training_sequence1, data_mem2, KNOWN_FIELD_SYNC_LENGTH);
- // filterN(&data_mem[KNOWN_FIELD_SYNC_LENGTH], data_mem2,
- // ATSC_DATA_SEGMENT_LENGTH - KNOWN_FIELD_SYNC_LENGTH);
}
} else {
filterN(data_mem, data_mem2, ATSC_DATA_SEGMENT_LENGTH);
- memcpy(out[output_produced].data,
+ memcpy(&out[output_produced * ATSC_DATA_SEGMENT_LENGTH],
data_mem2,
ATSC_DATA_SEGMENT_LENGTH * sizeof(float));
- out[output_produced].pli._flags = d_flags;
- out[output_produced].pli._segno = d_segno;
+ 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++;
}
memcpy(data_mem, &data_mem[ATSC_DATA_SEGMENT_LENGTH], NPRETAPS * sizeof(float));
- memcpy(&data_mem[NPRETAPS], in[i].data, ATSC_DATA_SEGMENT_LENGTH * sizeof(float));
-
- d_flags = in[i].pli._flags;
- d_segno = in[i].pli._segno;
+ memcpy(&data_mem[NPRETAPS],
+ 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");
+ }
}
consume_each(noutput_items);