diff options
author | Johnathan Corgan <johnathan@corganlabs.com> | 2015-01-21 13:00:58 -0800 |
---|---|---|
committer | Johnathan Corgan <johnathan@corganlabs.com> | 2015-01-21 13:00:58 -0800 |
commit | 83d3dca959d79f6acb5371f9a4efc8dbb8be7147 (patch) | |
tree | 9853aaf3d0ca63f00cd8396c37d2323ef76eac8f | |
parent | a8fbd0c6f0fef8da457fcf26f23991ef1237a5bb (diff) |
dtv: cleanup for merge
22 files changed, 491 insertions, 619 deletions
diff --git a/gr-dtv/include/gnuradio/dtv/CMakeLists.txt b/gr-dtv/include/gnuradio/dtv/CMakeLists.txt index 8aff3eb5eb..b7626e9658 100644 --- a/gr-dtv/include/gnuradio/dtv/CMakeLists.txt +++ b/gr-dtv/include/gnuradio/dtv/CMakeLists.txt @@ -32,7 +32,7 @@ install(FILES atsc_rs_decoder.h atsc_sync.h atsc_viterbi_decoder.h - atsc_depad.h + atsc_pad.h atsc_randomizer.h atsc_rs_encoder.h atsc_interleaver.h diff --git a/gr-dtv/include/gnuradio/dtv/atsc_field_sync_mux.h b/gr-dtv/include/gnuradio/dtv/atsc_field_sync_mux.h index 9eeef024c0..3b34e5ab9f 100644 --- a/gr-dtv/include/gnuradio/dtv/atsc_field_sync_mux.h +++ b/gr-dtv/include/gnuradio/dtv/atsc_field_sync_mux.h @@ -1,24 +1,23 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, * Boston, MA 02110-1301, USA. */ - #ifndef INCLUDED_DTV_ATSC_FIELD_SYNC_MUX_H #define INCLUDED_DTV_ATSC_FIELD_SYNC_MUX_H @@ -40,11 +39,6 @@ namespace gr { /*! * \brief Return a shared_ptr to a new instance of dtv::atsc_field_sync_mux. - * - * To avoid accidental use of raw pointers, dtv::atsc_field_sync_mux's - * constructor is in a private implementation - * class. dtv::atsc_field_sync_mux::make is the public interface for - * creating new instances. */ static sptr make(); }; @@ -53,4 +47,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_FIELD_SYNC_MUX_H */ - diff --git a/gr-dtv/include/gnuradio/dtv/atsc_interleaver.h b/gr-dtv/include/gnuradio/dtv/atsc_interleaver.h index 86d5493a9c..5882fd2ec0 100644 --- a/gr-dtv/include/gnuradio/dtv/atsc_interleaver.h +++ b/gr-dtv/include/gnuradio/dtv/atsc_interleaver.h @@ -1,24 +1,23 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, * Boston, MA 02110-1301, USA. */ - #ifndef INCLUDED_DTV_ATSC_INTERLEAVER_H #define INCLUDED_DTV_ATSC_INTERLEAVER_H @@ -40,11 +39,6 @@ namespace gr { /*! * \brief Return a shared_ptr to a new instance of dtv::atsc_interleaver. - * - * To avoid accidental use of raw pointers, dtv::atsc_interleaver's - * constructor is in a private implementation - * class. dtv::atsc_interleaver::make is the public interface for - * creating new instances. */ static sptr make(); }; @@ -53,4 +47,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_INTERLEAVER_H */ - diff --git a/gr-dtv/include/gnuradio/dtv/atsc_pad.h b/gr-dtv/include/gnuradio/dtv/atsc_pad.h index efd1680e31..b14f2e7c5e 100644 --- a/gr-dtv/include/gnuradio/dtv/atsc_pad.h +++ b/gr-dtv/include/gnuradio/dtv/atsc_pad.h @@ -1,24 +1,23 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, * Boston, MA 02110-1301, USA. */ - #ifndef INCLUDED_DTV_ATSC_PAD_H #define INCLUDED_DTV_ATSC_PAD_H @@ -40,11 +39,6 @@ namespace gr { /*! * \brief Return a shared_ptr to a new instance of dtv::atsc_pad. - * - * To avoid accidental use of raw pointers, dtv::atsc_pad's - * constructor is in a private implementation - * class. dtv::atsc_pad::make is the public interface for - * creating new instances. */ static sptr make(); }; @@ -53,4 +47,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_PAD_H */ - diff --git a/gr-dtv/include/gnuradio/dtv/atsc_randomizer.h b/gr-dtv/include/gnuradio/dtv/atsc_randomizer.h index f9823a76c7..e938f61614 100644 --- a/gr-dtv/include/gnuradio/dtv/atsc_randomizer.h +++ b/gr-dtv/include/gnuradio/dtv/atsc_randomizer.h @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -40,11 +40,6 @@ namespace gr { /*! * \brief Return a shared_ptr to a new instance of dtv::atsc_randomizer. - * - * To avoid accidental use of raw pointers, dtv::atsc_randomizer's - * constructor is in a private implementation - * class. dtv::atsc_randomizer::make is the public interface for - * creating new instances. */ static sptr make(); }; @@ -53,4 +48,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_RANDOMIZER_H */ - diff --git a/gr-dtv/include/gnuradio/dtv/atsc_rs_encoder.h b/gr-dtv/include/gnuradio/dtv/atsc_rs_encoder.h index bca73fd680..53889c73f8 100644 --- a/gr-dtv/include/gnuradio/dtv/atsc_rs_encoder.h +++ b/gr-dtv/include/gnuradio/dtv/atsc_rs_encoder.h @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -40,11 +40,6 @@ namespace gr { /*! * \brief Return a shared_ptr to a new instance of dtv::atsc_rs_encoder. - * - * To avoid accidental use of raw pointers, dtv::atsc_rs_encoder's - * constructor is in a private implementation - * class. dtv::atsc_rs_encoder::make is the public interface for - * creating new instances. */ static sptr make(); }; @@ -53,4 +48,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_RS_ENCODER_H */ - diff --git a/gr-dtv/include/gnuradio/dtv/atsc_trellis_encoder.h b/gr-dtv/include/gnuradio/dtv/atsc_trellis_encoder.h index 1c1e0a4265..925e9c21bd 100644 --- a/gr-dtv/include/gnuradio/dtv/atsc_trellis_encoder.h +++ b/gr-dtv/include/gnuradio/dtv/atsc_trellis_encoder.h @@ -1,24 +1,23 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, * Boston, MA 02110-1301, USA. */ - #ifndef INCLUDED_DTV_ATSC_TRELLIS_ENCODER_H #define INCLUDED_DTV_ATSC_TRELLIS_ENCODER_H @@ -40,11 +39,6 @@ namespace gr { /*! * \brief Return a shared_ptr to a new instance of dtv::atsc_trellis_encoder. - * - * To avoid accidental use of raw pointers, dtv::atsc_trellis_encoder's - * constructor is in a private implementation - * class. dtv::atsc_trellis_encoder::make is the public interface for - * creating new instances. */ static sptr make(); }; @@ -53,4 +47,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_TRELLIS_ENCODER_H */ - diff --git a/gr-dtv/lib/atsc/atsc_basic_trellis_encoder.cc b/gr-dtv/lib/atsc/atsc_basic_trellis_encoder.cc index f7327c75fb..b0aeee5df5 100644 --- a/gr-dtv/lib/atsc/atsc_basic_trellis_encoder.cc +++ b/gr-dtv/lib/atsc/atsc_basic_trellis_encoder.cc @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -54,12 +54,11 @@ namespace gr { int atsc_basic_trellis_encoder::encode(unsigned int input) { - assert (input < 4); - int index = (state << 2) + input; - state = next_state[index]; - return out_symbol[index]; + assert (input < 4); + int index = (state << 2) + input; + state = next_state[index]; + return out_symbol[index]; } } /* namespace dtv */ } /* namespace gr */ - diff --git a/gr-dtv/lib/atsc/atsc_basic_trellis_encoder.h b/gr-dtv/lib/atsc/atsc_basic_trellis_encoder.h index a4e64fb225..3bac601741 100644 --- a/gr-dtv/lib/atsc/atsc_basic_trellis_encoder.h +++ b/gr-dtv/lib/atsc/atsc_basic_trellis_encoder.h @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -38,10 +38,10 @@ namespace gr { class atsc_basic_trellis_encoder { - private: + private: int state; // two bit state; - public: + public: atsc_basic_trellis_encoder() : state(0) {} /*! 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 01400e697e..e9b875c6e9 100644 --- a/gr-dtv/lib/atsc/atsc_field_sync_mux_impl.cc +++ b/gr-dtv/lib/atsc/atsc_field_sync_mux_impl.cc @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -38,206 +38,183 @@ namespace gr { (new atsc_field_sync_mux_impl()); } - /* - * The private constructor - */ 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))) + 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; + d_already_output_field_sync = false; + for (int i = 0; i < N_SAVED_SYMBOLS; i++) { + d_saved_symbols[i] = 0; } } - /* - * Our virtual destructor. - */ 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]) + 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 + 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 - { - p[i++] = bin_map[atsc_pn511[j]]; - } + for (int j = 0; j < 511; j++) { // PN511 + p[i++] = bin_map[atsc_pn511[j]]; + } - for (int j = 0; j < 63; j++) // PN63 - { - p[i++] = bin_map[atsc_pn63[j]]; - } + 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 - { - p[i++] = bin_map[atsc_pn63[j] ^ mask]; - } + 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]]; - } + 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]]; - } + 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]; - // now copy the last 12 symbols of the previous segment + 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 < N_SAVED_SYMBOLS; j++) - { - p[i++] = saved_symbols[j]; - } + 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]; - assert (i == ATSC_DATA_SEGMENT_LENGTH); + 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]) + const unsigned char saved_symbols[N_SAVED_SYMBOLS]) { - init_field_sync_common(&s->data[0], 0, 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]) + const unsigned char saved_symbols[N_SAVED_SYMBOLS]) { - init_field_sync_common(&s->data[0], 1, 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]; + for (int i = 0; i < N_SAVED_SYMBOLS; i++) { + saved_symbols[i] = seg.data[i + ATSC_DATA_SEGMENT_LENGTH - N_SAVED_SYMBOLS]; } } 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); + 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; + 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) + 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++; + 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; + + if (in[index].pli.in_field1_p()) { + init_field_sync_1(&field_sync, d_saved_symbols); } - else - { // first_regular_seg_p - if (!d_already_output_field_sync) - { - // write out field sync... - atsc_data_segment field_sync; - - 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; - } + 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 gr */ - diff --git a/gr-dtv/lib/atsc/atsc_field_sync_mux_impl.h b/gr-dtv/lib/atsc/atsc_field_sync_mux_impl.h index ba73faaac6..ce4ab30323 100644 --- a/gr-dtv/lib/atsc/atsc_field_sync_mux_impl.h +++ b/gr-dtv/lib/atsc/atsc_field_sync_mux_impl.h @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -30,7 +30,7 @@ namespace gr { class atsc_field_sync_mux_impl : public atsc_field_sync_mux { - private: + private: static const int N_SAVED_SYMBOLS = 12; bool d_already_output_field_sync; unsigned char d_saved_symbols[N_SAVED_SYMBOLS]; @@ -41,7 +41,7 @@ namespace gr { void save_last_symbols(unsigned char saved_symbols[N_SAVED_SYMBOLS], const atsc_data_segment &seg); inline bool last_regular_seg_p(const plinfo &pli); - public: + public: atsc_field_sync_mux_impl(); ~atsc_field_sync_mux_impl(); @@ -57,4 +57,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_FIELD_SYNC_MUX_IMPL_H */ - diff --git a/gr-dtv/lib/atsc/atsc_interleaver_impl.cc b/gr-dtv/lib/atsc/atsc_interleaver_impl.cc index 6d147f5682..2826a5b786 100644 --- a/gr-dtv/lib/atsc/atsc_interleaver_impl.cc +++ b/gr-dtv/lib/atsc/atsc_interleaver_impl.cc @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -22,7 +22,6 @@ #include "config.h" #endif -#include <gnuradio/io_signature.h> #include "atsc_interleaver_impl.h" #include "gnuradio/dtv/atsc_consts.h" @@ -36,43 +35,37 @@ namespace gr { (new atsc_interleaver_impl()); } - /* - * The private constructor - */ atsc_interleaver_impl::atsc_interleaver_impl() : gr::sync_block("atsc_interleaver", - gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_rs_encoded)), - gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_rs_encoded))) + gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_rs_encoded)), + gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_rs_encoded))) { - I = 52; /* ATSC interleaver */ - J = 4; - registers = (unsigned char *) malloc(sizeof(unsigned char) * I * ((I - 1) * J)); - if (registers == NULL) { - fprintf(stderr, "Out of memory.\n"); - exit(1); - } - - pointers = (int *) malloc(sizeof(int) * I); - if (pointers == NULL) { - fprintf(stderr, "Out of memory.\n"); - exit(1); - } - - memset(registers, 0, sizeof(unsigned char) * I * ((I - 1) * J)); - memset(pointers, 0, sizeof(int) * I); - - this->I = I; - this->J = J; - commutator = 0; + I = 52; /* ATSC interleaver */ + J = 4; + registers = (unsigned char *) malloc(sizeof(unsigned char) * I * ((I - 1) * J)); + if (registers == NULL) { + fprintf(stderr, "Out of memory.\n"); + exit(1); + } + + pointers = (int *) malloc(sizeof(int) * I); + if (pointers == NULL) { + fprintf(stderr, "Out of memory.\n"); + exit(1); + } + + memset(registers, 0, sizeof(unsigned char) * I * ((I - 1) * J)); + memset(pointers, 0, sizeof(int) * I); + + this->I = I; + this->J = J; + commutator = 0; } - /* - * Our virtual destructor. - */ atsc_interleaver_impl::~atsc_interleaver_impl() { - free(pointers); - free(registers); + free(pointers); + free(registers); } int @@ -80,43 +73,38 @@ namespace gr { gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - const atsc_mpeg_packet_rs_encoded *in = (const atsc_mpeg_packet_rs_encoded *) input_items[0]; - atsc_mpeg_packet_rs_encoded *out = (atsc_mpeg_packet_rs_encoded *) output_items[0]; - int p, n = ATSC_MPEG_RS_ENCODED_LENGTH; - - for (int i = 0; i < noutput_items; i++) - { - assert(in[i].pli.regular_seg_p()); - plinfo::sanity_check(in[i].pli); - - out[i].pli = in[i].pli; // copy pipeline info - if (in[i].pli.first_regular_seg_p()) // reset commutator if required - { - commutator = 0; - } - for (int j = 0; j < n; j++) - { - if (commutator == 0) - { - out[i].data[j] = in[i].data[j]; - } - else - { - p = pointers[commutator]; - - out[i].data[j] = registers[commutator * (I - 1) * J + p]; - registers[commutator * (I - 1) * J + p] = in[i].data[j]; - - pointers[commutator] = (p + 1) % (commutator * J); - } - commutator = (commutator + 1) % I; - } + const atsc_mpeg_packet_rs_encoded *in = (const atsc_mpeg_packet_rs_encoded *) input_items[0]; + atsc_mpeg_packet_rs_encoded *out = (atsc_mpeg_packet_rs_encoded *) output_items[0]; + int p, n = ATSC_MPEG_RS_ENCODED_LENGTH; + + for (int i = 0; i < noutput_items; i++) { + assert(in[i].pli.regular_seg_p()); + plinfo::sanity_check(in[i].pli); + + out[i].pli = in[i].pli; // copy pipeline info + if (in[i].pli.first_regular_seg_p()) { // reset commutator if required + commutator = 0; + } + for (int j = 0; j < n; j++) { + if (commutator == 0) { + out[i].data[j] = in[i].data[j]; + } + else { + p = pointers[commutator]; + + out[i].data[j] = registers[commutator * (I - 1) * J + p]; + registers[commutator * (I - 1) * J + p] = in[i].data[j]; + + pointers[commutator] = (p + 1) % (commutator * J); + } + + commutator = (commutator + 1) % I; } + } - // Tell runtime system how many output items we produced. - return noutput_items; + // Tell runtime system how many output items we produced. + return noutput_items; } } /* namespace dtv */ } /* namespace gr */ - diff --git a/gr-dtv/lib/atsc/atsc_interleaver_impl.h b/gr-dtv/lib/atsc/atsc_interleaver_impl.h index 337edcf0ec..ffcd02bf84 100644 --- a/gr-dtv/lib/atsc/atsc_interleaver_impl.h +++ b/gr-dtv/lib/atsc/atsc_interleaver_impl.h @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -29,13 +29,13 @@ namespace gr { class atsc_interleaver_impl : public atsc_interleaver { - private: + private: int I, J; int commutator; unsigned char *registers; int *pointers; - public: + public: atsc_interleaver_impl(); ~atsc_interleaver_impl(); @@ -48,4 +48,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_INTERLEAVER_IMPL_H */ - diff --git a/gr-dtv/lib/atsc/atsc_pad_impl.cc b/gr-dtv/lib/atsc/atsc_pad_impl.cc index 1b5e733f19..2dee03f031 100644 --- a/gr-dtv/lib/atsc/atsc_pad_impl.cc +++ b/gr-dtv/lib/atsc/atsc_pad_impl.cc @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -22,7 +22,6 @@ #include "config.h" #endif -#include <gnuradio/io_signature.h> #include "atsc_pad_impl.h" #include "gnuradio/dtv/atsc_consts.h" @@ -36,18 +35,13 @@ namespace gr { (new atsc_pad_impl()); } - /* - * The private constructor - */ atsc_pad_impl::atsc_pad_impl() : gr::sync_decimator("atsc_pad", - gr::io_signature::make(1, 1, sizeof(unsigned char)), - gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet)), ATSC_MPEG_PKT_LENGTH) - {} + gr::io_signature::make(1, 1, sizeof(unsigned char)), + gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet)), ATSC_MPEG_PKT_LENGTH) + { + } - /* - * Our virtual destructor. - */ atsc_pad_impl::~atsc_pad_impl() { } @@ -57,18 +51,16 @@ namespace gr { gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - const unsigned char *in = (const unsigned char *) input_items[0]; - atsc_mpeg_packet *out = (atsc_mpeg_packet *) output_items[0]; + const unsigned char *in = (const unsigned char *) input_items[0]; + atsc_mpeg_packet *out = (atsc_mpeg_packet *) output_items[0]; - for (int i = 0; i < noutput_items; i++) - { - memcpy(out[i].data, &in[i * ATSC_MPEG_PKT_LENGTH], ATSC_MPEG_PKT_LENGTH); - } + for (int i = 0; i < noutput_items; i++) { + memcpy(out[i].data, &in[i * ATSC_MPEG_PKT_LENGTH], ATSC_MPEG_PKT_LENGTH); + } - // Tell runtime system how many output items we produced. - return noutput_items; + // Tell runtime system how many output items we produced. + return noutput_items; } } /* namespace dtv */ } /* namespace gr */ - diff --git a/gr-dtv/lib/atsc/atsc_pad_impl.h b/gr-dtv/lib/atsc/atsc_pad_impl.h index 4a661bd394..292931d1f7 100644 --- a/gr-dtv/lib/atsc/atsc_pad_impl.h +++ b/gr-dtv/lib/atsc/atsc_pad_impl.h @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -29,7 +29,7 @@ namespace gr { class atsc_pad_impl : public atsc_pad { - public: + public: atsc_pad_impl(); ~atsc_pad_impl(); @@ -42,4 +42,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_PAD_IMPL_H */ - diff --git a/gr-dtv/lib/atsc/atsc_randomizer_impl.cc b/gr-dtv/lib/atsc/atsc_randomizer_impl.cc index 55d47851d2..f6b6a6a370 100644 --- a/gr-dtv/lib/atsc/atsc_randomizer_impl.cc +++ b/gr-dtv/lib/atsc/atsc_randomizer_impl.cc @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -36,20 +36,14 @@ namespace gr { (new atsc_randomizer_impl()); } - /* - * The private constructor - */ atsc_randomizer_impl::atsc_randomizer_impl() : gr::sync_block("atsc_randomizer", - gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet)), - gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_no_sync))) + gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet)), + gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_no_sync))) { - reset(); + reset(); } - /* - * Our virtual destructor. - */ atsc_randomizer_impl::~atsc_randomizer_impl() { } @@ -57,9 +51,9 @@ namespace gr { void atsc_randomizer_impl::reset() { - d_rand.reset(); - d_field2 = false; - d_segno = 0; + d_rand.reset(); + d_field2 = false; + d_segno = 0; } int @@ -67,40 +61,37 @@ namespace gr { gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - const atsc_mpeg_packet *in = (const atsc_mpeg_packet *) input_items[0]; - atsc_mpeg_packet_no_sync *out = (atsc_mpeg_packet_no_sync *) output_items[0]; + const atsc_mpeg_packet *in = (const atsc_mpeg_packet *) input_items[0]; + atsc_mpeg_packet_no_sync *out = (atsc_mpeg_packet_no_sync *) output_items[0]; - for (int i = 0; i < noutput_items; i++) - { - // sanity check incoming data. - assert((in[i].data[0] == MPEG_SYNC_BYTE)); - assert((in[i].data[1] & MPEG_TRANSPORT_ERROR_BIT) == 0); + for (int i = 0; i < noutput_items; i++) { + // sanity check incoming data. + assert((in[i].data[0] == MPEG_SYNC_BYTE)); + assert((in[i].data[1] & MPEG_TRANSPORT_ERROR_BIT) == 0); - // initialize plinfo for downstream - // - // We do this here because the randomizer is effectively - // the head of the tx processing chain - // - out[i].pli.set_regular_seg(d_field2, d_segno); - d_segno++; - if (d_segno == 312) - { - d_segno = 0; - d_field2 = !d_field2; - } + // initialize plinfo for downstream + // + // We do this here because the randomizer is effectively + // the head of the tx processing chain + // + out[i].pli.set_regular_seg(d_field2, d_segno); + d_segno++; - if (out[i].pli.first_regular_seg_p()) - { - d_rand.reset(); - } + if (d_segno == 312) { + d_segno = 0; + d_field2 = !d_field2; + } - d_rand.randomize(out[i], in[i]); + if (out[i].pli.first_regular_seg_p()) { + d_rand.reset(); } - // Tell runtime system how many output items we produced. - return noutput_items; + d_rand.randomize(out[i], in[i]); + } + + // Tell runtime system how many output items we produced. + return noutput_items; } } /* namespace dtv */ } /* namespace gr */ - diff --git a/gr-dtv/lib/atsc/atsc_randomizer_impl.h b/gr-dtv/lib/atsc/atsc_randomizer_impl.h index 48ee213dfb..d13b09f5e4 100644 --- a/gr-dtv/lib/atsc/atsc_randomizer_impl.h +++ b/gr-dtv/lib/atsc/atsc_randomizer_impl.h @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -30,14 +30,14 @@ namespace gr { class atsc_randomizer_impl : public atsc_randomizer { - private: + private: atsc_randomize d_rand; int d_segno; bool d_field2; void reset(void); - public: + public: atsc_randomizer_impl(); ~atsc_randomizer_impl(); @@ -50,4 +50,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_RANDOMIZER_IMPL_H */ - diff --git a/gr-dtv/lib/atsc/atsc_rs_encoder_impl.cc b/gr-dtv/lib/atsc/atsc_rs_encoder_impl.cc index 002dc17d93..9249301165 100644 --- a/gr-dtv/lib/atsc/atsc_rs_encoder_impl.cc +++ b/gr-dtv/lib/atsc/atsc_rs_encoder_impl.cc @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -46,46 +46,40 @@ namespace gr { (new atsc_rs_encoder_impl()); } - /* - * The private constructor - */ atsc_rs_encoder_impl::atsc_rs_encoder_impl() : gr::sync_block("atsc_rs_encoder", - gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_no_sync)), - gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_rs_encoded))) + gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_no_sync)), + gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_rs_encoded))) { - d_rs = init_rs_char(rs_init_symsize, rs_init_gfpoly, rs_init_fcr, rs_init_prim, rs_init_nroots); - assert (d_rs != 0); + d_rs = init_rs_char(rs_init_symsize, rs_init_gfpoly, rs_init_fcr, rs_init_prim, rs_init_nroots); + assert (d_rs != 0); } - /* - * Our virtual destructor. - */ atsc_rs_encoder_impl::~atsc_rs_encoder_impl() { - if (d_rs) - { - free_rs_char(d_rs); - } - d_rs = 0; + if (d_rs) { + free_rs_char(d_rs); + } + + d_rs = 0; } void atsc_rs_encoder_impl::encode(atsc_mpeg_packet_rs_encoded &out, const atsc_mpeg_packet_no_sync &in) { - unsigned char tmp[K]; + unsigned char tmp[K]; - assert((int)(amount_of_pad + sizeof (in.data)) == K); + assert((int)(amount_of_pad + sizeof (in.data)) == K); - // add missing prefix zero padding to message - memset(tmp, 0, amount_of_pad); - memcpy(&tmp[amount_of_pad], in.data, sizeof (in.data)); + // add missing prefix zero padding to message + memset(tmp, 0, amount_of_pad); + memcpy(&tmp[amount_of_pad], in.data, sizeof (in.data)); - // copy message portion to output packet - memcpy(out.data, in.data, sizeof (in.data)); + // copy message portion to output packet + memcpy(out.data, in.data, sizeof (in.data)); - // now compute parity bytes and add them to tail end of output packet - encode_rs_char(d_rs, tmp, &out.data[sizeof (in.data)]); + // now compute parity bytes and add them to tail end of output packet + encode_rs_char(d_rs, tmp, &out.data[sizeof (in.data)]); } int @@ -93,20 +87,18 @@ namespace gr { 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_rs_encoded *out = (atsc_mpeg_packet_rs_encoded *) output_items[0]; - - for (int i = 0; i < noutput_items; i++) - { - assert(in[i].pli.regular_seg_p()); - out[i].pli = in[i].pli; // copy pipeline info... - encode(out[i], in[i]); - } - - // Tell runtime system how many output items we produced. - return noutput_items; + const atsc_mpeg_packet_no_sync *in = (const atsc_mpeg_packet_no_sync *) input_items[0]; + atsc_mpeg_packet_rs_encoded *out = (atsc_mpeg_packet_rs_encoded *) output_items[0]; + + for (int i = 0; i < noutput_items; i++) { + assert(in[i].pli.regular_seg_p()); + out[i].pli = in[i].pli; // copy pipeline info... + encode(out[i], in[i]); + } + + // Tell runtime system how many output items we produced. + return noutput_items; } } /* namespace dtv */ } /* namespace gr */ - diff --git a/gr-dtv/lib/atsc/atsc_rs_encoder_impl.h b/gr-dtv/lib/atsc/atsc_rs_encoder_impl.h index 3f82a29f03..9086c8223d 100644 --- a/gr-dtv/lib/atsc/atsc_rs_encoder_impl.h +++ b/gr-dtv/lib/atsc/atsc_rs_encoder_impl.h @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -34,11 +34,11 @@ namespace gr { class atsc_rs_encoder_impl : public atsc_rs_encoder { - private: + private: void *d_rs; void encode(atsc_mpeg_packet_rs_encoded &out, const atsc_mpeg_packet_no_sync &in); - public: + public: atsc_rs_encoder_impl(); ~atsc_rs_encoder_impl(); @@ -51,4 +51,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_RS_ENCODER_IMPL_H */ - diff --git a/gr-dtv/lib/atsc/atsc_trellis_encoder_impl.cc b/gr-dtv/lib/atsc/atsc_trellis_encoder_impl.cc index 3baf045d25..3252f94d31 100644 --- a/gr-dtv/lib/atsc/atsc_trellis_encoder_impl.cc +++ b/gr-dtv/lib/atsc/atsc_trellis_encoder_impl.cc @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -22,34 +22,33 @@ #include "config.h" #endif -#include <gnuradio/io_signature.h> +#include <stdio.h> #include "atsc_trellis_encoder_impl.h" #include "gnuradio/dtv/atsc_consts.h" -#include <stdio.h> namespace gr { namespace dtv { -static const int DIBITS_PER_BYTE = 4; + static const int DIBITS_PER_BYTE = 4; #define SEGOF(x) ( (x) / ((SEGMENT_SIZE + 1) * DIBITS_PER_BYTE)) #define SYMOF(x) (((x) % ((SEGMENT_SIZE + 1) * DIBITS_PER_BYTE)) - 4) -/* How many separate Trellis encoders / Viterbi decoders run in parallel */ -static const int NCODERS = 12; + /* How many separate Trellis encoders / Viterbi decoders run in parallel */ + static const int NCODERS = 12; #define ENCODER_SEG_BUMP 4 -/* A Segment sync symbol is an 8VSB +5,-5,-5,+5 sequence that occurs at - the start of each 207-byte segment (including field sync segments). */ + /* A Segment sync symbol is an 8VSB +5,-5,-5,+5 sequence that occurs at + the start of each 207-byte segment (including field sync segments). */ #define DSEG_SYNC_SYM1 0x06 /* +5 */ #define DSEG_SYNC_SYM2 0x01 /* -5 */ #define DSEG_SYNC_SYM3 0x01 /* -5 */ #define DSEG_SYNC_SYM4 0x06 /* +5 */ -/* Shift counts to bit numbers (high order, low order); 9x entries unused */ -static const int bit1[8] = {1, 99, 3, 98, 5, 97, 7, 96}; -static const int bit2[8] = {0, 99, 2, 98, 4, 97, 6, 96}; + /* Shift counts to bit numbers (high order, low order); 9x entries unused */ + static const int bit1[8] = {1, 99, 3, 98, 5, 97, 7, 96}; + static const int bit2[8] = {0, 99, 2, 98, 4, 97, 6, 96}; atsc_trellis_encoder::sptr atsc_trellis_encoder::make() @@ -58,22 +57,16 @@ static const int bit2[8] = {0, 99, 2, 98, 4, 97, 6, 96}; (new atsc_trellis_encoder_impl()); } - /* - * The private constructor - */ atsc_trellis_encoder_impl::atsc_trellis_encoder_impl() : gr::sync_block("atsc_trellis_encoder", - gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_rs_encoded)), - gr::io_signature::make(1, 1, sizeof(atsc_data_segment))) + gr::io_signature::make(1, 1, sizeof(atsc_mpeg_packet_rs_encoded)), + gr::io_signature::make(1, 1, sizeof(atsc_data_segment))) { - reset(); - debug = false; - set_output_multiple(NCODERS); + reset(); + debug = false; + set_output_multiple(NCODERS); } - /* - * Our virtual destructor. - */ atsc_trellis_encoder_impl::~atsc_trellis_encoder_impl() { } @@ -81,46 +74,43 @@ static const int bit2[8] = {0, 99, 2, 98, 4, 97, 6, 96}; void atsc_trellis_encoder_impl::reset() { - for (int i = 0; i < NCODERS; i++) - { - enc[i].reset(); - } + for (int i = 0; i < NCODERS; i++) { + enc[i].reset(); + } } void atsc_trellis_encoder_impl::encode(atsc_data_segment out[NCODERS], const atsc_mpeg_packet_rs_encoded in[NCODERS]) { - unsigned char out_copy[OUTPUT_SIZE]; - unsigned char in_copy[INPUT_SIZE]; - - assert (sizeof (in_copy) == sizeof (in[0].data) * NCODERS); - assert (sizeof (out_copy) == sizeof (out[0].data) * NCODERS); - - // copy input into continguous temporary buffer - for (int i = 0; i < NCODERS; i++) - { - assert(in[i].pli.regular_seg_p()); - plinfo::sanity_check (in[i].pli); - memcpy(&in_copy[i * INPUT_SIZE / NCODERS], &in[i].data[0], ATSC_MPEG_RS_ENCODED_LENGTH * sizeof (in_copy[0])); - } + unsigned char out_copy[OUTPUT_SIZE]; + unsigned char in_copy[INPUT_SIZE]; - memset(out_copy, 0, sizeof (out_copy)); // FIXME, sanity check + assert (sizeof (in_copy) == sizeof (in[0].data) * NCODERS); + assert (sizeof (out_copy) == sizeof (out[0].data) * NCODERS); - // do the deed... - encode_helper(out_copy, in_copy); + // copy input into continguous temporary buffer + for (int i = 0; i < NCODERS; i++) { + assert(in[i].pli.regular_seg_p()); + plinfo::sanity_check (in[i].pli); + memcpy(&in_copy[i * INPUT_SIZE / NCODERS], &in[i].data[0], ATSC_MPEG_RS_ENCODED_LENGTH * sizeof (in_copy[0])); + } - // copy output from contiguous temp buffer into final output - for (int i = 0; i < NCODERS; i++) - { - memcpy(&out[i].data[0], &out_copy[i * OUTPUT_SIZE / NCODERS], ATSC_DATA_SEGMENT_LENGTH * sizeof (out_copy[0])); + memset(out_copy, 0, sizeof (out_copy)); // FIXME, sanity check - // copy pipeline info - out[i].pli = in[i].pli; + // do the deed... + encode_helper(out_copy, in_copy); - plinfo::sanity_check(out[i].pli); - assert(out[i].pli.regular_seg_p()); - } + // copy output from contiguous temp buffer into final output + for (int i = 0; i < NCODERS; i++) { + memcpy(&out[i].data[0], &out_copy[i * OUTPUT_SIZE / NCODERS], ATSC_DATA_SEGMENT_LENGTH * sizeof (out_copy[0])); + + // copy pipeline info + out[i].pli = in[i].pli; + + plinfo::sanity_check(out[i].pli); + assert(out[i].pli.regular_seg_p()); + } } /* @@ -132,114 +122,105 @@ static const int bit2[8] = {0, 99, 2, 98, 4, 97, 6, 96}; atsc_trellis_encoder_impl::encode_helper(unsigned char output[OUTPUT_SIZE], const unsigned char input[INPUT_SIZE]) { - int i; - int encoder; - unsigned char trellis_buffer[NCODERS]; - int trellis_wherefrom[NCODERS]; - unsigned char *out, *next_out_seg; - int chunk; - int shift; - unsigned char dibit; - unsigned char symbol; - int skip_encoder_bump; - - /* FIXME, we may want special processing here for a flag - * byte to keep track of which part of the field we're in? + int i; + int encoder; + unsigned char trellis_buffer[NCODERS]; + int trellis_wherefrom[NCODERS]; + unsigned char *out, *next_out_seg; + int chunk; + int shift; + unsigned char dibit; + unsigned char symbol; + int skip_encoder_bump; + + /* FIXME, we may want special processing here for a flag + * byte to keep track of which part of the field we're in? + */ + + encoder = NCODERS - ENCODER_SEG_BUMP; + skip_encoder_bump = 0; + out = output; + next_out_seg = out; + + for (chunk = 0; chunk < INPUT_SIZE; chunk += NCODERS) { + /* Load a new chunk of bytes into the Trellis encoder buffers. + * They get loaded in an order that depends on where we are in + * the segment sync progress (sigh). + * GRR! When the chunk reload happens at the same time as the + * segment boundary, we should bump the encoder NOW for the reload, + * rather than LATER during the bitshift transition!!! */ + if (out >= next_out_seg) { + encoder = (encoder + ENCODER_SEG_BUMP) % NCODERS; + skip_encoder_bump = 1; + } + + for (i = 0; i < NCODERS; i++) { + /* for debug */ + trellis_wherefrom[encoder] = chunk + i; + trellis_buffer[encoder] = input [chunk + i]; + encoder++; + if (encoder >= NCODERS) { + encoder = 0; + } + } - encoder = NCODERS - ENCODER_SEG_BUMP; - skip_encoder_bump = 0; - out = output; - next_out_seg = out; - - for (chunk = 0; chunk < INPUT_SIZE; chunk += NCODERS) - { - /* Load a new chunk of bytes into the Trellis encoder buffers. - * They get loaded in an order that depends on where we are in - * the segment sync progress (sigh). - * GRR! When the chunk reload happens at the same time as the - * segment boundary, we should bump the encoder NOW for the reload, - * rather than LATER during the bitshift transition!!! + for (shift = 6; shift >= 0; shift -= 2) { + /* Segment boundaries happen to occur on some bitshift transitions. */ + if (out >= next_out_seg) { + /* Segment transition. Output a data segment sync symbol, + * and mess with the trellis encoder mux. */ - if (out >= next_out_seg) - { - encoder = (encoder + ENCODER_SEG_BUMP) % NCODERS; - skip_encoder_bump = 1; + *out++ = DSEG_SYNC_SYM1; + *out++ = DSEG_SYNC_SYM2; + *out++ = DSEG_SYNC_SYM3; + *out++ = DSEG_SYNC_SYM4; + if (debug) { + printf("SYNC SYNC SYNC SYNC\n"); } - for (i = 0; i < NCODERS; i++) - { - /* for debug */ - trellis_wherefrom[encoder] = chunk + i; - trellis_buffer[encoder] = input [chunk + i]; - encoder++; - if (encoder >= NCODERS) - { - encoder = 0; - } + next_out_seg = out + (SEGMENT_SIZE * DIBITS_PER_BYTE); + + if (!skip_encoder_bump) { + encoder = (encoder + ENCODER_SEG_BUMP) % NCODERS; + } + skip_encoder_bump = 0; + } + + /* Now run each of the 12 Trellis encoders to spit out 12 symbols. + * Each encoder takes input from the same byte of the chunk, but + * the outputs of the encoders come out in various orders. + * NOPE -- this is false. The encoders take input from various + * bytes of the chunk (which changes at segment sync time), AND + * they also come out in various orders. You really do have to + * keep separate track of: the input bytes, the encoders, and + * the output bytes -- because they're all moving with respect + * to each other!!! + */ + for (i = 0; i < NCODERS; i++) { + dibit = 0x03 & (trellis_buffer[encoder] >> shift); + if (debug) { + printf("Seg %ld Symb %3ld Trell %2d Byte %6d Bits %d-%d = dibit %d ", (long) SEGOF(out-output), (long) SYMOF(out-output), encoder, trellis_wherefrom[encoder], bit1[shift], bit2[shift], dibit); } - for (shift = 6; shift >= 0; shift -= 2) - { - /* Segment boundaries happen to occur on some bitshift transitions. */ - if (out >= next_out_seg) - { - /* Segment transition. Output a data segment sync symbol, - * and mess with the trellis encoder mux. - */ - *out++ = DSEG_SYNC_SYM1; - *out++ = DSEG_SYNC_SYM2; - *out++ = DSEG_SYNC_SYM3; - *out++ = DSEG_SYNC_SYM4; - if (debug) - { - printf("SYNC SYNC SYNC SYNC\n"); - } - next_out_seg = out + (SEGMENT_SIZE * DIBITS_PER_BYTE); - - if (!skip_encoder_bump) - { - encoder = (encoder + ENCODER_SEG_BUMP) % NCODERS; - } - skip_encoder_bump = 0; - } - - /* Now run each of the 12 Trellis encoders to spit out 12 symbols. - * Each encoder takes input from the same byte of the chunk, but - * the outputs of the encoders come out in various orders. - * NOPE -- this is false. The encoders take input from various - * bytes of the chunk (which changes at segment sync time), AND - * they also come out in various orders. You really do have to - * keep separate track of: the input bytes, the encoders, and - * the output bytes -- because they're all moving with respect - * to each other!!! - */ - for (i = 0; i < NCODERS; i++) - { - dibit = 0x03 & (trellis_buffer[encoder] >> shift); - if (debug) - { - printf("Seg %ld Symb %3ld Trell %2d Byte %6d Bits %d-%d = dibit %d ", (long) SEGOF(out-output), (long) SYMOF(out-output), encoder, trellis_wherefrom[encoder], bit1[shift], bit2[shift], dibit); - } - symbol = enc[encoder].encode(dibit); - *out++ = symbol; - encoder++; - if (encoder >= NCODERS) - { - encoder = 0; - } - if (debug) - { - printf("sym %d\n", symbol); - } - } /* Encoders */ - } /* Bit shifts */ - } /* Chunks */ - - /* Check up on ourselves */ - assert (0 == (INPUT_SIZE * DIBITS_PER_BYTE) % NCODERS); - assert (OUTPUT_SIZE == out - output); - assert (NCODERS - ENCODER_SEG_BUMP == encoder); + symbol = enc[encoder].encode(dibit); + *out++ = symbol; + encoder++; + if (encoder >= NCODERS) { + encoder = 0; + } + if (debug) { + printf("sym %d\n", symbol); + } + + } /* Encoders */ + } /* Bit shifts */ + } /* Chunks */ + + /* Check up on ourselves */ + assert (0 == (INPUT_SIZE * DIBITS_PER_BYTE) % NCODERS); + assert (OUTPUT_SIZE == out - output); + assert (NCODERS - ENCODER_SEG_BUMP == encoder); } int @@ -247,18 +228,16 @@ static const int bit2[8] = {0, 99, 2, 98, 4, 97, 6, 96}; gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { - const atsc_mpeg_packet_rs_encoded *in = (const atsc_mpeg_packet_rs_encoded *) input_items[0]; - atsc_data_segment *out = (atsc_data_segment *) output_items[0]; + const atsc_mpeg_packet_rs_encoded *in = (const atsc_mpeg_packet_rs_encoded *) input_items[0]; + atsc_data_segment *out = (atsc_data_segment *) output_items[0]; - for (int i = 0; i < noutput_items; i += NCODERS) - { - encode(&out[i], &in[i]); - } + for (int i = 0; i < noutput_items; i += NCODERS) { + encode(&out[i], &in[i]); + } - // Tell runtime system how many output items we produced. - return noutput_items; + // Tell runtime system how many output items we produced. + return noutput_items; } } /* namespace dtv */ } /* namespace gr */ - diff --git a/gr-dtv/lib/atsc/atsc_trellis_encoder_impl.h b/gr-dtv/lib/atsc/atsc_trellis_encoder_impl.h index f81b4d0015..054a3aca3b 100644 --- a/gr-dtv/lib/atsc/atsc_trellis_encoder_impl.h +++ b/gr-dtv/lib/atsc/atsc_trellis_encoder_impl.h @@ -1,17 +1,17 @@ /* -*- c++ -*- */ -/* +/* * Copyright 2015 Free Software Foundation, Inc. - * + * * This is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3, or (at your option) * any later version. - * + * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, @@ -30,7 +30,7 @@ namespace gr { class atsc_trellis_encoder_impl : public atsc_trellis_encoder { - private: + private: bool debug; static const int NCODERS = 12; @@ -44,7 +44,7 @@ namespace gr { atsc_basic_trellis_encoder enc[NCODERS]; - public: + public: atsc_trellis_encoder_impl(); ~atsc_trellis_encoder_impl(); @@ -57,4 +57,3 @@ namespace gr { } // namespace gr #endif /* INCLUDED_DTV_ATSC_TRELLIS_ENCODER_IMPL_H */ - diff --git a/gr-dtv/swig/dtv_swig.i b/gr-dtv/swig/dtv_swig.i index 0baaafd71b..0226ac63f4 100644 --- a/gr-dtv/swig/dtv_swig.i +++ b/gr-dtv/swig/dtv_swig.i @@ -32,47 +32,47 @@ #include "gnuradio/dtv/atsc_depad.h" #include "gnuradio/dtv/atsc_derandomizer.h" #include "gnuradio/dtv/atsc_equalizer.h" +#include "gnuradio/dtv/atsc_field_sync_mux.h" #include "gnuradio/dtv/atsc_fpll.h" #include "gnuradio/dtv/atsc_fs_checker.h" -#include "gnuradio/dtv/atsc_rs_decoder.h" -#include "gnuradio/dtv/atsc_sync.h" -#include "gnuradio/dtv/atsc_viterbi_decoder.h" +#include "gnuradio/dtv/atsc_interleaver.h" #include "gnuradio/dtv/atsc_pad.h" #include "gnuradio/dtv/atsc_randomizer.h" +#include "gnuradio/dtv/atsc_rs_decoder.h" #include "gnuradio/dtv/atsc_rs_encoder.h" -#include "gnuradio/dtv/atsc_interleaver.h" +#include "gnuradio/dtv/atsc_sync.h" #include "gnuradio/dtv/atsc_trellis_encoder.h" -#include "gnuradio/dtv/atsc_field_sync_mux.h" +#include "gnuradio/dtv/atsc_viterbi_decoder.h" %} %include "gnuradio/dtv/atsc_deinterleaver.h" %include "gnuradio/dtv/atsc_depad.h" %include "gnuradio/dtv/atsc_derandomizer.h" %include "gnuradio/dtv/atsc_equalizer.h" +%include "gnuradio/dtv/atsc_field_sync_mux.h" %include "gnuradio/dtv/atsc_fpll.h" %include "gnuradio/dtv/atsc_fs_checker.h" -%include "gnuradio/dtv/atsc_rs_decoder.h" -%include "gnuradio/dtv/atsc_sync.h" -%include "gnuradio/dtv/atsc_viterbi_decoder.h" +%include "gnuradio/dtv/atsc_interleaver.h" %include "gnuradio/dtv/atsc_pad.h" %include "gnuradio/dtv/atsc_randomizer.h" +%include "gnuradio/dtv/atsc_rs_decoder.h" %include "gnuradio/dtv/atsc_rs_encoder.h" -%include "gnuradio/dtv/atsc_interleaver.h" +%include "gnuradio/dtv/atsc_sync.h" %include "gnuradio/dtv/atsc_trellis_encoder.h" -%include "gnuradio/dtv/atsc_field_sync_mux.h" +%include "gnuradio/dtv/atsc_viterbi_decoder.h" GR_SWIG_BLOCK_MAGIC2(dtv, atsc_deinterleaver); GR_SWIG_BLOCK_MAGIC2(dtv, atsc_depad); GR_SWIG_BLOCK_MAGIC2(dtv, atsc_derandomizer); GR_SWIG_BLOCK_MAGIC2(dtv, atsc_equalizer) +GR_SWIG_BLOCK_MAGIC2(dtv, atsc_field_sync_mux); GR_SWIG_BLOCK_MAGIC2(dtv, atsc_fpll); GR_SWIG_BLOCK_MAGIC2(dtv, atsc_fs_checker); -GR_SWIG_BLOCK_MAGIC2(dtv, atsc_rs_decoder); -GR_SWIG_BLOCK_MAGIC2(dtv, atsc_sync); -GR_SWIG_BLOCK_MAGIC2(dtv, atsc_viterbi_decoder); +GR_SWIG_BLOCK_MAGIC2(dtv, atsc_interleaver); GR_SWIG_BLOCK_MAGIC2(dtv, atsc_pad); GR_SWIG_BLOCK_MAGIC2(dtv, atsc_randomizer); +GR_SWIG_BLOCK_MAGIC2(dtv, atsc_rs_decoder); GR_SWIG_BLOCK_MAGIC2(dtv, atsc_rs_encoder); -GR_SWIG_BLOCK_MAGIC2(dtv, atsc_interleaver); +GR_SWIG_BLOCK_MAGIC2(dtv, atsc_sync); GR_SWIG_BLOCK_MAGIC2(dtv, atsc_trellis_encoder); -GR_SWIG_BLOCK_MAGIC2(dtv, atsc_field_sync_mux); +GR_SWIG_BLOCK_MAGIC2(dtv, atsc_viterbi_decoder); |