summaryrefslogtreecommitdiff
path: root/gr-dtv/lib/atsc/atsc_field_sync_mux_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-dtv/lib/atsc/atsc_field_sync_mux_impl.cc')
-rw-r--r--gr-dtv/lib/atsc/atsc_field_sync_mux_impl.cc314
1 files changed, 151 insertions, 163 deletions
diff --git a/gr-dtv/lib/atsc/atsc_field_sync_mux_impl.cc b/gr-dtv/lib/atsc/atsc_field_sync_mux_impl.cc
index ed9c44a85c..4d058718f6 100644
--- a/gr-dtv/lib/atsc/atsc_field_sync_mux_impl.cc
+++ b/gr-dtv/lib/atsc/atsc_field_sync_mux_impl.cc
@@ -27,198 +27,186 @@
#include "gnuradio/dtv/atsc_consts.h"
namespace gr {
- namespace dtv {
-
- static const int N_SAVED_SYMBOLS = 12;
-
- atsc_field_sync_mux::sptr
- atsc_field_sync_mux::make()
- {
- return gnuradio::get_initial_sptr
- (new atsc_field_sync_mux_impl());
- }
-
- atsc_field_sync_mux_impl::atsc_field_sync_mux_impl()
- : gr::block("atsc_field_sync_mux",
- gr::io_signature::make(1, 1, sizeof(atsc_data_segment)),
- gr::io_signature::make(1, 1, sizeof(atsc_data_segment)))
- {
- d_already_output_field_sync = false;
- for (int i = 0; i < N_SAVED_SYMBOLS; i++) {
- d_saved_symbols[i] = 0;
- }
+namespace dtv {
+
+static const int N_SAVED_SYMBOLS = 12;
+
+atsc_field_sync_mux::sptr atsc_field_sync_mux::make()
+{
+ return gnuradio::get_initial_sptr(new atsc_field_sync_mux_impl());
+}
+
+atsc_field_sync_mux_impl::atsc_field_sync_mux_impl()
+ : gr::block("atsc_field_sync_mux",
+ gr::io_signature::make(1, 1, sizeof(atsc_data_segment)),
+ gr::io_signature::make(1, 1, sizeof(atsc_data_segment)))
+{
+ d_already_output_field_sync = false;
+ for (int i = 0; i < N_SAVED_SYMBOLS; i++) {
+ d_saved_symbols[i] = 0;
}
+}
- atsc_field_sync_mux_impl::~atsc_field_sync_mux_impl()
- {
- }
+atsc_field_sync_mux_impl::~atsc_field_sync_mux_impl() {}
- void
- atsc_field_sync_mux_impl::init_field_sync_common(unsigned char *p, int mask,
- const unsigned char saved_symbols[N_SAVED_SYMBOLS])
- {
- static const unsigned char bin_map[2] = {1, 6}; // map binary values to 1 of 8 levels
+void atsc_field_sync_mux_impl::init_field_sync_common(
+ unsigned char* p, int mask, const unsigned char saved_symbols[N_SAVED_SYMBOLS])
+{
+ static const unsigned char bin_map[2] = { 1,
+ 6 }; // map binary values to 1 of 8 levels
- int i = 0;
+ int i = 0;
- p[i++] = bin_map[1]; // data segment sync pulse
- p[i++] = bin_map[0];
- p[i++] = bin_map[0];
- p[i++] = bin_map[1];
+ p[i++] = bin_map[1]; // data segment sync pulse
+ p[i++] = bin_map[0];
+ p[i++] = bin_map[0];
+ p[i++] = bin_map[1];
- for (int j = 0; j < 511; j++) { // PN511
+ for (int j = 0; j < 511; j++) { // PN511
p[i++] = bin_map[atsc_pn511[j]];
- }
+ }
- for (int j = 0; j < 63; j++) { // PN63
+ for (int j = 0; j < 63; j++) { // PN63
p[i++] = bin_map[atsc_pn63[j]];
- }
+ }
- for (int j = 0; j < 63; j++) { // PN63, toggled on field 2
+ for (int j = 0; j < 63; j++) { // PN63, toggled on field 2
p[i++] = bin_map[atsc_pn63[j] ^ mask];
- }
-
- for (int j = 0; j < 63; j++) { // PN63
- p[i++] = bin_map[atsc_pn63[j]];
- }
-
- p[i++] = bin_map[0]; // 24 bits of 8VSB mode identifier
- p[i++] = bin_map[0];
- p[i++] = bin_map[0];
- p[i++] = bin_map[0];
-
- p[i++] = bin_map[1];
- p[i++] = bin_map[0];
- p[i++] = bin_map[1];
- p[i++] = bin_map[0];
-
- p[i++] = bin_map[0];
- p[i++] = bin_map[1];
- p[i++] = bin_map[0];
- p[i++] = bin_map[1];
-
- p[i++] = bin_map[1];
- p[i++] = bin_map[1];
- p[i++] = bin_map[1];
- p[i++] = bin_map[1];
-
- p[i++] = bin_map[0];
- p[i++] = bin_map[1];
- p[i++] = bin_map[0];
- p[i++] = bin_map[1];
-
- p[i++] = bin_map[1];
- p[i++] = bin_map[0];
- p[i++] = bin_map[1];
- p[i++] = bin_map[0];
-
- for (int j = 0; j < 92; j++) { // 92 more bits
- p[i++] = bin_map[atsc_pn63[j % 63]];
- }
-
- // now copy the last 12 symbols of the previous segment
-
- for (int j = 0; j < N_SAVED_SYMBOLS; j++) {
- p[i++] = saved_symbols[j];
- }
-
- assert(i == ATSC_DATA_SEGMENT_LENGTH);
}
- inline void
- atsc_field_sync_mux_impl::init_field_sync_1(atsc_data_segment *s,
- const unsigned char saved_symbols[N_SAVED_SYMBOLS])
- {
- init_field_sync_common(&s->data[0], 0, saved_symbols);
+ for (int j = 0; j < 63; j++) { // PN63
+ p[i++] = bin_map[atsc_pn63[j]];
}
- inline void
- atsc_field_sync_mux_impl::init_field_sync_2(atsc_data_segment *s,
- const unsigned char saved_symbols[N_SAVED_SYMBOLS])
- {
- init_field_sync_common(&s->data[0], 1, saved_symbols);
+ p[i++] = bin_map[0]; // 24 bits of 8VSB mode identifier
+ p[i++] = bin_map[0];
+ p[i++] = bin_map[0];
+ p[i++] = bin_map[0];
+
+ p[i++] = bin_map[1];
+ p[i++] = bin_map[0];
+ p[i++] = bin_map[1];
+ p[i++] = bin_map[0];
+
+ p[i++] = bin_map[0];
+ p[i++] = bin_map[1];
+ p[i++] = bin_map[0];
+ p[i++] = bin_map[1];
+
+ p[i++] = bin_map[1];
+ p[i++] = bin_map[1];
+ p[i++] = bin_map[1];
+ p[i++] = bin_map[1];
+
+ p[i++] = bin_map[0];
+ p[i++] = bin_map[1];
+ p[i++] = bin_map[0];
+ p[i++] = bin_map[1];
+
+ p[i++] = bin_map[1];
+ p[i++] = bin_map[0];
+ p[i++] = bin_map[1];
+ p[i++] = bin_map[0];
+
+ for (int j = 0; j < 92; j++) { // 92 more bits
+ p[i++] = bin_map[atsc_pn63[j % 63]];
}
- void
- atsc_field_sync_mux_impl::save_last_symbols(unsigned char saved_symbols[N_SAVED_SYMBOLS],
- const atsc_data_segment &seg)
- {
- for (int i = 0; i < N_SAVED_SYMBOLS; i++) {
- saved_symbols[i] = seg.data[i + ATSC_DATA_SEGMENT_LENGTH - N_SAVED_SYMBOLS];
- }
- }
+ // now copy the last 12 symbols of the previous segment
- inline bool
- atsc_field_sync_mux_impl::last_regular_seg_p(const plinfo &pli)
- {
- return pli.regular_seg_p() && (pli.segno() == ATSC_DSEGS_PER_FIELD - 1);
+ for (int j = 0; j < N_SAVED_SYMBOLS; j++) {
+ p[i++] = saved_symbols[j];
}
- void
- atsc_field_sync_mux_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
- {
- ninput_items_required[0] = noutput_items;
+ assert(i == ATSC_DATA_SEGMENT_LENGTH);
+}
+
+inline void atsc_field_sync_mux_impl::init_field_sync_1(
+ atsc_data_segment* s, const unsigned char saved_symbols[N_SAVED_SYMBOLS])
+{
+ init_field_sync_common(&s->data[0], 0, saved_symbols);
+}
+
+inline void atsc_field_sync_mux_impl::init_field_sync_2(
+ atsc_data_segment* s, const unsigned char saved_symbols[N_SAVED_SYMBOLS])
+{
+ init_field_sync_common(&s->data[0], 1, saved_symbols);
+}
+
+void atsc_field_sync_mux_impl::save_last_symbols(
+ unsigned char saved_symbols[N_SAVED_SYMBOLS], const atsc_data_segment& seg)
+{
+ for (int i = 0; i < N_SAVED_SYMBOLS; i++) {
+ saved_symbols[i] = seg.data[i + ATSC_DATA_SEGMENT_LENGTH - N_SAVED_SYMBOLS];
}
-
- int
- atsc_field_sync_mux_impl::general_work (int noutput_items,
- gr_vector_int &ninput_items,
- gr_vector_const_void_star &input_items,
- gr_vector_void_star &output_items)
- {
- const atsc_data_segment *in = (const atsc_data_segment *) input_items[0];
- atsc_data_segment *out = (atsc_data_segment *) output_items[0];
- int in_length = ninput_items[0];
- int index = 0;
- int outdex = 0;
-
- for (outdex = 0; outdex < noutput_items && index < in_length; outdex++) {
+}
+
+inline bool atsc_field_sync_mux_impl::last_regular_seg_p(const plinfo& pli)
+{
+ return pli.regular_seg_p() && (pli.segno() == ATSC_DSEGS_PER_FIELD - 1);
+}
+
+void atsc_field_sync_mux_impl::forecast(int noutput_items,
+ gr_vector_int& ninput_items_required)
+{
+ ninput_items_required[0] = noutput_items;
+}
+
+int atsc_field_sync_mux_impl::general_work(int noutput_items,
+ gr_vector_int& ninput_items,
+ gr_vector_const_void_star& input_items,
+ gr_vector_void_star& output_items)
+{
+ const atsc_data_segment* in = (const atsc_data_segment*)input_items[0];
+ atsc_data_segment* out = (atsc_data_segment*)output_items[0];
+ int in_length = ninput_items[0];
+ int index = 0;
+ int outdex = 0;
+
+ for (outdex = 0; outdex < noutput_items && index < in_length; outdex++) {
assert(in[index].pli.regular_seg_p());
if (!in[index].pli.first_regular_seg_p()) {
- out[outdex] = in[index]; // just copy in to out
-
- if (last_regular_seg_p(in[index].pli)) {
- save_last_symbols(d_saved_symbols, in[index]);
- }
- index++;
- }
- else { // first_regular_seg_p
- if (!d_already_output_field_sync) {
- // write out field sync...
- atsc_data_segment field_sync;
-
- field_sync.pli._flags = 0;
- field_sync.pli._segno = 0;
- memset(field_sync._pad_, 0, atsc_data_segment::NPAD);
+ out[outdex] = in[index]; // just copy in to out
- if (in[index].pli.in_field1_p()) {
- init_field_sync_1(&field_sync, d_saved_symbols);
+ if (last_regular_seg_p(in[index].pli)) {
+ save_last_symbols(d_saved_symbols, in[index]);
}
- else {
- init_field_sync_2(&field_sync, d_saved_symbols);
- }
-
- // note that index doesn't advance in this branch
- out[outdex] = field_sync;
- d_already_output_field_sync = true;
- }
- else {
- // already output field sync, now output first regular segment
- out[outdex] = in[index];
index++;
- d_already_output_field_sync = false;
- }
+ } else { // first_regular_seg_p
+ if (!d_already_output_field_sync) {
+ // write out field sync...
+ atsc_data_segment field_sync;
+
+ field_sync.pli._flags = 0;
+ field_sync.pli._segno = 0;
+ memset(field_sync._pad_, 0, atsc_data_segment::NPAD);
+
+ if (in[index].pli.in_field1_p()) {
+ init_field_sync_1(&field_sync, d_saved_symbols);
+ } else {
+ init_field_sync_2(&field_sync, d_saved_symbols);
+ }
+
+ // note that index doesn't advance in this branch
+ out[outdex] = field_sync;
+ d_already_output_field_sync = true;
+ } else {
+ // already output field sync, now output first regular segment
+ out[outdex] = in[index];
+ index++;
+ d_already_output_field_sync = false;
+ }
}
- }
+ }
- // Tell runtime system how many input items we consumed on
- // each input stream.
- consume_each (index);
+ // Tell runtime system how many input items we consumed on
+ // each input stream.
+ consume_each(index);
- // Tell runtime system how many output items we produced.
- return outdex;
- }
+ // Tell runtime system how many output items we produced.
+ return outdex;
+}
- } /* namespace dtv */
+} /* namespace dtv */
} /* namespace gr */