diff options
author | Clayton Smith <argilo@gmail.com> | 2016-01-27 08:30:35 -0800 |
---|---|---|
committer | Ron Economos <w6rz@comcast.net> | 2016-01-27 08:30:35 -0800 |
commit | e59e44e11d37b0ddc76a58b45e818a1e60a73fd3 (patch) | |
tree | b6cd47dfa9509f211bdbeaa59bb5f6df81c6db42 | |
parent | b17bcb88e68a0347a273e9369e21b9d67c2137a1 (diff) |
gr-dtv: Add ITU-T J.83B 64QAM transmitter.
20 files changed, 1348 insertions, 0 deletions
diff --git a/gr-dtv/grc/dtv_catv_frame_sync_enc_bb.xml b/gr-dtv/grc/dtv_catv_frame_sync_enc_bb.xml new file mode 100644 index 0000000000..e7c1392960 --- /dev/null +++ b/gr-dtv/grc/dtv_catv_frame_sync_enc_bb.xml @@ -0,0 +1,26 @@ +<?xml version="1.0"?> +<!-- +################################################### +## Frame Sync Encoder +################################################### + --> +<block> + <name>Frame Sync Encoder</name> + <key>dtv_catv_frame_sync_enc_bb</key> + <import>from gnuradio import dtv</import> + <make>dtv.catv_frame_sync_enc_bb($ctrlword)</make> + <param> + <name>Control Word</name> + <key>ctrlword</key> + <value>6</value> + <type>int</type> + </param> + <sink> + <name>in</name> + <type>byte</type> + </sink> + <source> + <name>out</name> + <type>byte</type> + </source> +</block> diff --git a/gr-dtv/grc/dtv_catv_randomizer_bb.xml b/gr-dtv/grc/dtv_catv_randomizer_bb.xml new file mode 100644 index 0000000000..ca4787d786 --- /dev/null +++ b/gr-dtv/grc/dtv_catv_randomizer_bb.xml @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<!-- +################################################### +## Randomizer +################################################### + --> +<block> + <name>Randomizer</name> + <key>dtv_catv_randomizer_bb</key> + <import>from gnuradio import dtv</import> + <make>dtv.catv_randomizer_bb()</make> + <sink> + <name>in</name> + <type>byte</type> + </sink> + <source> + <name>out</name> + <type>byte</type> + </source> +</block> diff --git a/gr-dtv/grc/dtv_catv_reed_solomon_enc_bb.xml b/gr-dtv/grc/dtv_catv_reed_solomon_enc_bb.xml new file mode 100644 index 0000000000..a5dfdc2a5a --- /dev/null +++ b/gr-dtv/grc/dtv_catv_reed_solomon_enc_bb.xml @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<!-- +################################################### +## Reed Solomon Encoder +################################################### + --> +<block> + <name>Reed-Solomon Encoder</name> + <key>dtv_catv_reed_solomon_enc_bb</key> + <import>from gnuradio import dtv</import> + <make>dtv.catv_reed_solomon_enc_bb()</make> + <sink> + <name>in</name> + <type>byte</type> + </sink> + <source> + <name>out</name> + <type>byte</type> + </source> +</block> diff --git a/gr-dtv/grc/dtv_catv_transport_framing_enc_bb.xml b/gr-dtv/grc/dtv_catv_transport_framing_enc_bb.xml new file mode 100644 index 0000000000..d0b6bf382b --- /dev/null +++ b/gr-dtv/grc/dtv_catv_transport_framing_enc_bb.xml @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<!-- +################################################### +## Transport Framing Encoder +################################################### + --> +<block> + <name>Transport Framing Encoder</name> + <key>dtv_catv_transport_framing_enc_bb</key> + <import>from gnuradio import dtv</import> + <make>dtv.catv_transport_framing_enc_bb()</make> + <sink> + <name>in</name> + <type>byte</type> + </sink> + <source> + <name>out</name> + <type>byte</type> + </source> +</block> diff --git a/gr-dtv/grc/dtv_catv_trellis_enc_bb.xml b/gr-dtv/grc/dtv_catv_trellis_enc_bb.xml new file mode 100644 index 0000000000..a96d60c895 --- /dev/null +++ b/gr-dtv/grc/dtv_catv_trellis_enc_bb.xml @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<!-- +################################################### +## Trellis Encoder +################################################### + --> +<block> + <name>Trellis Encoder</name> + <key>dtv_catv_trellis_enc_bb</key> + <import>from gnuradio import dtv</import> + <make>dtv.catv_trellis_enc_bb()</make> + <sink> + <name>in</name> + <type>byte</type> + </sink> + <source> + <name>out</name> + <type>byte</type> + </source> +</block> diff --git a/gr-dtv/include/gnuradio/dtv/catv_frame_sync_enc_bb.h b/gr-dtv/include/gnuradio/dtv/catv_frame_sync_enc_bb.h new file mode 100644 index 0000000000..799a2d3c55 --- /dev/null +++ b/gr-dtv/include/gnuradio/dtv/catv_frame_sync_enc_bb.h @@ -0,0 +1,54 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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_CATV_FRAME_SYNC_ENC_BB_H +#define INCLUDED_DTV_CATV_FRAME_SYNC_ENC_BB_H + +#include <gnuradio/dtv/api.h> +#include <gnuradio/block.h> + +namespace gr { + namespace dtv { + + /*! + * \brief Frame Sync Encoder. Adds a 42-bit frame sync pattern with control word. + * \ingroup dtv + * + * Input: Scrambled FEC Frame packets of 60 * 128 7-bit symbols.\n + * Output: Scrambled FEC Frame packets of 60 * 128 7-bit symbols with 42-bit FSYNC word. + */ + class DTV_API catv_frame_sync_enc_bb : virtual public gr::block + { + public: + typedef boost::shared_ptr<catv_frame_sync_enc_bb> sptr; + + /*! + * \brief Create an ITU-T J.83B Frame Sync Encoder. + * + * \param ctrlword convolutional interleaver control word. + */ + static sptr make(int ctrlword); + }; + + } // namespace dtv +} // namespace gr + +#endif /* INCLUDED_DTV_CATV_FRAME_SYNC_ENC_BB_H */ + diff --git a/gr-dtv/include/gnuradio/dtv/catv_randomizer_bb.h b/gr-dtv/include/gnuradio/dtv/catv_randomizer_bb.h new file mode 100644 index 0000000000..83230b8167 --- /dev/null +++ b/gr-dtv/include/gnuradio/dtv/catv_randomizer_bb.h @@ -0,0 +1,53 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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_CATV_RANDOMIZER_BB_H +#define INCLUDED_DTV_CATV_RANDOMIZER_BB_H + +#include <gnuradio/dtv/api.h> +#include <gnuradio/sync_block.h> + +namespace gr { + namespace dtv { + + /*! + * \brief Randomizer, x^3 + x + alpha^3, 7-bit symbols. + * \ingroup dtv + * + * Input: Interleaved MPEG-2 + RS parity bitstream packets of 128 7-bit symbols.\n + * Output: Scrambled FEC Frame packets of 60 * 128 7-bit symbols. + */ + class DTV_API catv_randomizer_bb : virtual public gr::sync_block + { + public: + typedef boost::shared_ptr<catv_randomizer_bb> sptr; + + /*! + * \brief Create an ITU-T J.83B randomizer. + * + */ + static sptr make(); + }; + + } // namespace dtv +} // namespace gr + +#endif /* INCLUDED_DTV_CATV_RANDOMIZER_BB_H */ + diff --git a/gr-dtv/include/gnuradio/dtv/catv_reed_solomon_enc_bb.h b/gr-dtv/include/gnuradio/dtv/catv_reed_solomon_enc_bb.h new file mode 100644 index 0000000000..b661f0da7f --- /dev/null +++ b/gr-dtv/include/gnuradio/dtv/catv_reed_solomon_enc_bb.h @@ -0,0 +1,53 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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_CATV_REED_SOLOMON_ENC_BB_H +#define INCLUDED_DTV_CATV_REED_SOLOMON_ENC_BB_H + +#include <gnuradio/dtv/api.h> +#include <gnuradio/block.h> + +namespace gr { + namespace dtv { + + /*! + * \brief Reed Solomon Encoder, t=3, (128,122), 7-bit symbols. + * \ingroup dtv + * + * Input: MPEG-2 bitstream packets of 122 7-bit symbols.\n + * Output: MPEG-2 + RS parity bitstream packets of 128 7-bit symbols. + */ + class DTV_API catv_reed_solomon_enc_bb : virtual public gr::block + { + public: + typedef boost::shared_ptr<catv_reed_solomon_enc_bb> sptr; + + /*! + * \brief Create an ITU-T J.83B Reed Solomon encoder. + * + */ + static sptr make(); + }; + + } // namespace dtv +} // namespace gr + +#endif /* INCLUDED_DTV_CATV_REED_SOLOMON_ENC_BB_H */ + diff --git a/gr-dtv/include/gnuradio/dtv/catv_transport_framing_enc_bb.h b/gr-dtv/include/gnuradio/dtv/catv_transport_framing_enc_bb.h new file mode 100644 index 0000000000..7df100d990 --- /dev/null +++ b/gr-dtv/include/gnuradio/dtv/catv_transport_framing_enc_bb.h @@ -0,0 +1,53 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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_CATV_TRANSPORT_FRAMING_ENC_BB_H +#define INCLUDED_DTV_CATV_TRANSPORT_FRAMING_ENC_BB_H + +#include <gnuradio/dtv/api.h> +#include <gnuradio/sync_block.h> + +namespace gr { + namespace dtv { + + /*! + * \brief Transport Framing Encoder. Adds a parity checksum to MPEG-2 packets. + * \ingroup dtv + * + * Input: MPEG-2 Transport Stream.\n + * Output: MPEG-2 Transport Stream with parity checksum byte. + */ + class DTV_API catv_transport_framing_enc_bb : virtual public gr::sync_block + { + public: + typedef boost::shared_ptr<catv_transport_framing_enc_bb> sptr; + + /*! + * \brief Create an ITU-T J.83B Transport Framing Encoder. + * + */ + static sptr make(); + }; + + } // namespace dtv +} // namespace gr + +#endif /* INCLUDED_DTV_CATV_TRANSPORT_FRAMING_ENC_BB_H */ + diff --git a/gr-dtv/include/gnuradio/dtv/catv_trellis_enc_bb.h b/gr-dtv/include/gnuradio/dtv/catv_trellis_enc_bb.h new file mode 100644 index 0000000000..aa6cec1703 --- /dev/null +++ b/gr-dtv/include/gnuradio/dtv/catv_trellis_enc_bb.h @@ -0,0 +1,53 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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_CATV_TRELLIS_ENC_BB_H +#define INCLUDED_DTV_CATV_TRELLIS_ENC_BB_H + +#include <gnuradio/dtv/api.h> +#include <gnuradio/block.h> + +namespace gr { + namespace dtv { + + /*! + * \brief Trellis Encoder. 14/15 code rate. + * \ingroup dtv + * + * Input: Scrambled FEC Frame packets of 60 * 128 7-bit symbols with 42-bit FSYNC word.\n + * Output: Four 7-bit symbols (28 bits) Trellis encoded to 30 bits (14/15 code rate). + */ + class DTV_API catv_trellis_enc_bb : virtual public gr::block + { + public: + typedef boost::shared_ptr<catv_trellis_enc_bb> sptr; + + /*! + * \brief Create an ITU-T J.83B Trellis Encoder. + * + */ + static sptr make(); + }; + + } // namespace dtv +} // namespace gr + +#endif /* INCLUDED_DTV_CATV_TRELLIS_ENC_BB_H */ + diff --git a/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.cc b/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.cc new file mode 100644 index 0000000000..87c706b445 --- /dev/null +++ b/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.cc @@ -0,0 +1,96 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gnuradio/io_signature.h> +#include "catv_frame_sync_enc_bb_impl.h" + +namespace gr { + namespace dtv { + + catv_frame_sync_enc_bb::sptr + catv_frame_sync_enc_bb::make(int ctrlword) + { + return gnuradio::get_initial_sptr + (new catv_frame_sync_enc_bb_impl(ctrlword)); + } + + /* + * The private constructor + */ + catv_frame_sync_enc_bb_impl::catv_frame_sync_enc_bb_impl(int ctrlword) + : gr::block("catv_frame_sync_enc_bb", + gr::io_signature::make(1, 1, sizeof(unsigned char)), + gr::io_signature::make(1, 1, sizeof(unsigned char))) + { + set_output_multiple(60 * 128 + 6); + control_word = ctrlword; + } + + /* + * Our virtual destructor. + */ + catv_frame_sync_enc_bb_impl::~catv_frame_sync_enc_bb_impl() + { + } + + void + catv_frame_sync_enc_bb_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required) + { + ninput_items_required[0] = noutput_items / (60 * 128 + 6) * (60 * 128); + } + + int + catv_frame_sync_enc_bb_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 unsigned char *in = (const unsigned char *) input_items[0]; + unsigned char *out = (unsigned char *) output_items[0]; + + int i = 0, j = 0; + while (i < noutput_items) { + memcpy(out + i, in + j, 60 * 128); + i += 60 * 128; + j += 60 * 128; + + out[i++] = 0x75; + out[i++] = 0x2C; + out[i++] = 0x0D; + out[i++] = 0x6C; + out[i++] = control_word << 3; + out[i++] = 0x00; + } + + // Tell runtime system how many input items we consumed on + // each input stream. + consume_each (j); + + // Tell runtime system how many output items we produced. + return noutput_items; + } + + } /* namespace dtv */ +} /* namespace gr */ + diff --git a/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.h b/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.h new file mode 100644 index 0000000000..fb924f7a14 --- /dev/null +++ b/gr-dtv/lib/catv/catv_frame_sync_enc_bb_impl.h @@ -0,0 +1,50 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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_CATV_FRAME_SYNC_ENC_BB_IMPL_H +#define INCLUDED_DTV_CATV_FRAME_SYNC_ENC_BB_IMPL_H + +#include <gnuradio/dtv/catv_frame_sync_enc_bb.h> + +namespace gr { + namespace dtv { + + class catv_frame_sync_enc_bb_impl : public catv_frame_sync_enc_bb + { + private: + int control_word; + + public: + catv_frame_sync_enc_bb_impl(int ctrlword); + ~catv_frame_sync_enc_bb_impl(); + + void forecast (int noutput_items, gr_vector_int &ninput_items_required); + + int general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + }; + + } // namespace dtv +} // namespace gr + +#endif /* INCLUDED_DTV_CATV_FRAME_SYNC_ENC_BB_IMPL_H */ + diff --git a/gr-dtv/lib/catv/catv_randomizer_bb_impl.cc b/gr-dtv/lib/catv/catv_randomizer_bb_impl.cc new file mode 100644 index 0000000000..698288dcd3 --- /dev/null +++ b/gr-dtv/lib/catv/catv_randomizer_bb_impl.cc @@ -0,0 +1,104 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gnuradio/io_signature.h> +#include "catv_randomizer_bb_impl.h" + +namespace gr { + namespace dtv { + + catv_randomizer_bb::sptr + catv_randomizer_bb::make() + { + return gnuradio::get_initial_sptr + (new catv_randomizer_bb_impl()); + } + + /* + * The private constructor + */ + catv_randomizer_bb_impl::catv_randomizer_bb_impl() + : gr::sync_block("catv_randomizer_bb", + gr::io_signature::make(1, 1, sizeof(unsigned char)), + gr::io_signature::make(1, 1, sizeof(unsigned char))) + { + init_rand(); + + offset = 0; + max_offset = 60 * 128; + } + + /* + * Our virtual destructor. + */ + catv_randomizer_bb_impl::~catv_randomizer_bb_impl() + { + } + + void + catv_randomizer_bb_impl::init_rand() + { + unsigned char c2 = 0x7F, c1 = 0x7F, c0 = 0x7F; + unsigned char c2_new, c1_new, c0_new; + int n, i; + + for (n = 0; n < 60 * 128; n++) { + rseq[n] = c2; + c2_new = c1; + c1_new = c0 ^ c2; + c0_new = c2; + for (i = 0; i < 3; i++) { + c0_new <<= 1; + if (c0_new & 0x80) { + c0_new = (c0_new & 0x7F) ^ 0x09; + } + } + c2 = c2_new; + c1 = c1_new; + c0 = c0_new; + } + } + + int + catv_randomizer_bb_impl::work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) + { + const unsigned char *in = (const unsigned char *) input_items[0]; + unsigned char *out = (unsigned char *) output_items[0]; + + for (int i = 0; i < noutput_items; i++) { + out[i] = in[i] ^ rseq[offset++]; + if (offset == max_offset) { + offset = 0; + } + } + + // Tell runtime system how many output items we produced. + return noutput_items; + } + + } /* namespace dtv */ +} /* namespace gr */ + diff --git a/gr-dtv/lib/catv/catv_randomizer_bb_impl.h b/gr-dtv/lib/catv/catv_randomizer_bb_impl.h new file mode 100644 index 0000000000..e4e40f8f6e --- /dev/null +++ b/gr-dtv/lib/catv/catv_randomizer_bb_impl.h @@ -0,0 +1,49 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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_CATV_RANDOMIZER_BB_IMPL_H +#define INCLUDED_DTV_CATV_RANDOMIZER_BB_IMPL_H + +#include <gnuradio/dtv/catv_randomizer_bb.h> + +namespace gr { + namespace dtv { + + class catv_randomizer_bb_impl : public catv_randomizer_bb + { + private: + unsigned char rseq[60 * 128]; + int offset, max_offset; + void init_rand(); + + public: + catv_randomizer_bb_impl(); + ~catv_randomizer_bb_impl(); + + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + }; + + } // namespace dtv +} // namespace gr + +#endif /* INCLUDED_DTV_CATV_RANDOMIZER_BB_IMPL_H */ + diff --git a/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.cc b/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.cc new file mode 100644 index 0000000000..06a1f12c3e --- /dev/null +++ b/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.cc @@ -0,0 +1,153 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gnuradio/io_signature.h> +#include "catv_reed_solomon_enc_bb_impl.h" + +namespace gr { + namespace dtv { + + catv_reed_solomon_enc_bb::sptr + catv_reed_solomon_enc_bb::make() + { + return gnuradio::get_initial_sptr + (new catv_reed_solomon_enc_bb_impl()); + } + + /* + * The private constructor + */ + catv_reed_solomon_enc_bb_impl::catv_reed_solomon_enc_bb_impl() + : gr::block("catv_reed_solomon_enc_bb", + gr::io_signature::make(1, 1, sizeof(unsigned char)), + gr::io_signature::make(1, 1, sizeof(unsigned char))) + { + set_output_multiple(128); + init_rs(); + } + + /* + * Our virtual destructor. + */ + catv_reed_solomon_enc_bb_impl::~catv_reed_solomon_enc_bb_impl() + { + } + + void + catv_reed_solomon_enc_bb_impl::init_rs() + { + unsigned char x; + int i, j; + + gf_exp[0] = 1; + gf_log[1] = 0; + + x = 1; + for (i = 1; i < 127; i++) { + x <<= 1; + if (x & 0x80) { + x = (x & 0x7F) ^ 0x09; + } + gf_exp[i] = x; + gf_log[x] = i; + } + for (; i < 256; i++) { + gf_exp[i] = gf_exp[i - 127]; + } + + for (i = 0; i < 128; i++) { + for (j = 0; j < 128; j++) { + if ((i == 0) || (j == 0)) { + gf_mul_table[i][j] = 0; + } else { + gf_mul_table[i][j] = gf_exp[gf_log[i] + gf_log[j]]; + } + } + } + } + + unsigned char + catv_reed_solomon_enc_bb_impl::gf_poly_eval(unsigned char *p, int len, unsigned char x) + { + unsigned char y = p[0]; + int i; + + for (i = 1; i < len; i++) { + y = gf_mul_table[y][x] ^ p[i]; + } + return y; + } + + void + catv_reed_solomon_enc_bb_impl::reed_solomon_enc(const unsigned char *message, unsigned char *output) + { + // Generator polynomial from p.7 of ANSI/SCTE 07 2013 + unsigned char g[] = {1, gf_exp[52], gf_exp[116], gf_exp[119], gf_exp[61], gf_exp[15]}; + int i, j; + + memcpy(output, message, 122); + memset(output + 122, 0, 6); + + for (i = 0; i < 122; i++) { + for (j = 1; j < 6; j++) { + output[i + j] ^= gf_mul_table[output[i]][g[j]]; + } + output[i] = message[i]; + } + + output[127] = gf_poly_eval(output, 128, gf_exp[6]); + } + + void + catv_reed_solomon_enc_bb_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required) + { + ninput_items_required[0] = (noutput_items / 128) * 122; + } + + int + catv_reed_solomon_enc_bb_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 unsigned char *in = (const unsigned char *) input_items[0]; + unsigned char *out = (unsigned char *) output_items[0]; + int j = 0; + + for (int i = 0; i < noutput_items; i += 128) { + reed_solomon_enc(in + j, out + i); + j += 122; + } + + // Tell runtime system how many input items we consumed on + // each input stream. + consume_each (j); + + // Tell runtime system how many output items we produced. + return noutput_items; + } + + } /* namespace dtv */ +} /* namespace gr */ + diff --git a/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.h b/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.h new file mode 100644 index 0000000000..84e4cb500e --- /dev/null +++ b/gr-dtv/lib/catv/catv_reed_solomon_enc_bb_impl.h @@ -0,0 +1,56 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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_CATV_REED_SOLOMON_ENC_BB_IMPL_H +#define INCLUDED_DTV_CATV_REED_SOLOMON_ENC_BB_IMPL_H + +#include <gnuradio/dtv/catv_reed_solomon_enc_bb.h> + +namespace gr { + namespace dtv { + + class catv_reed_solomon_enc_bb_impl : public catv_reed_solomon_enc_bb + { + private: + unsigned char gf_mul_table[128][128]; + unsigned char gf_exp[256]; + unsigned char gf_log[128]; + + void init_rs(); + unsigned char gf_poly_eval(unsigned char *p, int len, unsigned char x); + void reed_solomon_enc(const unsigned char *message, unsigned char *output); + + public: + catv_reed_solomon_enc_bb_impl(); + ~catv_reed_solomon_enc_bb_impl(); + + void forecast (int noutput_items, gr_vector_int &ninput_items_required); + + int general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + }; + + } // namespace dtv +} // namespace gr + +#endif /* INCLUDED_DTV_CATV_REED_SOLOMON_ENC_BB_IMPL_H */ + diff --git a/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.cc b/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.cc new file mode 100644 index 0000000000..4082e8265c --- /dev/null +++ b/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.cc @@ -0,0 +1,131 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gnuradio/io_signature.h> +#include "catv_transport_framing_enc_bb_impl.h" + +namespace gr { + namespace dtv { + + catv_transport_framing_enc_bb::sptr + catv_transport_framing_enc_bb::make() + { + return gnuradio::get_initial_sptr + (new catv_transport_framing_enc_bb_impl()); + } + + /* + * The private constructor + */ + catv_transport_framing_enc_bb_impl::catv_transport_framing_enc_bb_impl() + : gr::sync_block("catv_transport_framing_enc_bb", + gr::io_signature::make(1, 1, sizeof(unsigned char)), + gr::io_signature::make(1, 1, sizeof(unsigned char))) + { + set_output_multiple(188); + } + + /* + * Our virtual destructor. + */ + catv_transport_framing_enc_bb_impl::~catv_transport_framing_enc_bb_impl() + { + } + + unsigned char catv_transport_framing_enc_bb_impl::compute_sum(const unsigned char *bytes) + { + unsigned char i, bit, out, out1, out2, out3; + + unsigned char tapsG = 0xB1; // 10110001 + unsigned char tapsB = 0x45; // 1000101 + + unsigned char register1 = 0; + unsigned char register2 = 0; + unsigned char register3 = 0; + + unsigned char result = 0x67; + + unsigned char first7[] = {0, 0, 0, 0, 0, 0, 0, 0}; + + for (i = 0; i < 8; i++) { + bit = (bytes[0] >> (7-i)) & 1; + out = (register1 & 1) ^ bit; + if (i < 7) { + first7[i+1] = out; + } + register1 >>= 1; + if (out == 1) { + register1 ^= tapsG; + } + } + + for (i = 1; i < 187; i++) { + register1 = crctable[((register1) ^ BitReverseTable[bytes[i]]) & 0xff]; + } + + for (i = 0; i < 8; i++) { + out1 = register1 & 1; + register1 >>= 1; + if (out1 == 1) { + register1 ^= tapsG; + } + + out2 = (register2 & 1) ^ first7[i]; + register2 >>= 1; + if (first7[i] == 1) { + register2 ^= tapsB; + } + + out3 = (register3 & 1) ^ out1 ^ out2; + register3 >>= 1; + if ((out1 ^ out2) == 1) { + register3 ^= tapsG; + } + + result ^= (out3 << (7-i)); + } + + return result; + } + + int + catv_transport_framing_enc_bb_impl::work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) + { + const unsigned char *in = (const unsigned char *) input_items[0]; + unsigned char *out = (unsigned char *) output_items[0]; + + for (int i = 0; i < noutput_items; i += 188) { + memcpy(out + i, in + i + 1, 187); + out[i + 187] = compute_sum(in + i + 1); + } + + // Tell runtime system how many output items we produced. + return noutput_items; + } + + } /* namespace dtv */ +} /* namespace gr */ + diff --git a/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.h b/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.h new file mode 100644 index 0000000000..fe69bc01f6 --- /dev/null +++ b/gr-dtv/lib/catv/catv_transport_framing_enc_bb_impl.h @@ -0,0 +1,84 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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_CATV_TRANSPORT_FRAMING_ENC_BB_IMPL_H +#define INCLUDED_DTV_CATV_TRANSPORT_FRAMING_ENC_BB_IMPL_H + +#include <gnuradio/dtv/catv_transport_framing_enc_bb.h> + +namespace gr { + namespace dtv { + static const unsigned char crctable[] = { + 0x00,0x1b,0x36,0x2d,0x6c,0x77,0x5a,0x41,0xd8,0xc3,0xee,0xf5,0xb4,0xaf,0x82,0x99, + 0xd3,0xc8,0xe5,0xfe,0xbf,0xa4,0x89,0x92,0x0b,0x10,0x3d,0x26,0x67,0x7c,0x51,0x4a, + 0xc5,0xde,0xf3,0xe8,0xa9,0xb2,0x9f,0x84,0x1d,0x06,0x2b,0x30,0x71,0x6a,0x47,0x5c, + 0x16,0x0d,0x20,0x3b,0x7a,0x61,0x4c,0x57,0xce,0xd5,0xf8,0xe3,0xa2,0xb9,0x94,0x8f, + 0xe9,0xf2,0xdf,0xc4,0x85,0x9e,0xb3,0xa8,0x31,0x2a,0x07,0x1c,0x5d,0x46,0x6b,0x70, + 0x3a,0x21,0x0c,0x17,0x56,0x4d,0x60,0x7b,0xe2,0xf9,0xd4,0xcf,0x8e,0x95,0xb8,0xa3, + 0x2c,0x37,0x1a,0x01,0x40,0x5b,0x76,0x6d,0xf4,0xef,0xc2,0xd9,0x98,0x83,0xae,0xb5, + 0xff,0xe4,0xc9,0xd2,0x93,0x88,0xa5,0xbe,0x27,0x3c,0x11,0x0a,0x4b,0x50,0x7d,0x66, + 0xb1,0xaa,0x87,0x9c,0xdd,0xc6,0xeb,0xf0,0x69,0x72,0x5f,0x44,0x05,0x1e,0x33,0x28, + 0x62,0x79,0x54,0x4f,0x0e,0x15,0x38,0x23,0xba,0xa1,0x8c,0x97,0xd6,0xcd,0xe0,0xfb, + 0x74,0x6f,0x42,0x59,0x18,0x03,0x2e,0x35,0xac,0xb7,0x9a,0x81,0xc0,0xdb,0xf6,0xed, + 0xa7,0xbc,0x91,0x8a,0xcb,0xd0,0xfd,0xe6,0x7f,0x64,0x49,0x52,0x13,0x08,0x25,0x3e, + 0x58,0x43,0x6e,0x75,0x34,0x2f,0x02,0x19,0x80,0x9b,0xb6,0xad,0xec,0xf7,0xda,0xc1, + 0x8b,0x90,0xbd,0xa6,0xe7,0xfc,0xd1,0xca,0x53,0x48,0x65,0x7e,0x3f,0x24,0x09,0x12, + 0x9d,0x86,0xab,0xb0,0xf1,0xea,0xc7,0xdc,0x45,0x5e,0x73,0x68,0x29,0x32,0x1f,0x04, + 0x4e,0x55,0x78,0x63,0x22,0x39,0x14,0x0f,0x96,0x8d,0xa0,0xbb,0xfa,0xe1,0xcc,0xd7 + }; + + static const unsigned char BitReverseTable[] = { + 0x00,0x80,0x40,0xC0,0x20,0xA0,0x60,0xE0,0x10,0x90,0x50,0xD0,0x30,0xB0,0x70,0xF0, + 0x08,0x88,0x48,0xC8,0x28,0xA8,0x68,0xE8,0x18,0x98,0x58,0xD8,0x38,0xB8,0x78,0xF8, + 0x04,0x84,0x44,0xC4,0x24,0xA4,0x64,0xE4,0x14,0x94,0x54,0xD4,0x34,0xB4,0x74,0xF4, + 0x0C,0x8C,0x4C,0xCC,0x2C,0xAC,0x6C,0xEC,0x1C,0x9C,0x5C,0xDC,0x3C,0xBC,0x7C,0xFC, + 0x02,0x82,0x42,0xC2,0x22,0xA2,0x62,0xE2,0x12,0x92,0x52,0xD2,0x32,0xB2,0x72,0xF2, + 0x0A,0x8A,0x4A,0xCA,0x2A,0xAA,0x6A,0xEA,0x1A,0x9A,0x5A,0xDA,0x3A,0xBA,0x7A,0xFA, + 0x06,0x86,0x46,0xC6,0x26,0xA6,0x66,0xE6,0x16,0x96,0x56,0xD6,0x36,0xB6,0x76,0xF6, + 0x0E,0x8E,0x4E,0xCE,0x2E,0xAE,0x6E,0xEE,0x1E,0x9E,0x5E,0xDE,0x3E,0xBE,0x7E,0xFE, + 0x01,0x81,0x41,0xC1,0x21,0xA1,0x61,0xE1,0x11,0x91,0x51,0xD1,0x31,0xB1,0x71,0xF1, + 0x09,0x89,0x49,0xC9,0x29,0xA9,0x69,0xE9,0x19,0x99,0x59,0xD9,0x39,0xB9,0x79,0xF9, + 0x05,0x85,0x45,0xC5,0x25,0xA5,0x65,0xE5,0x15,0x95,0x55,0xD5,0x35,0xB5,0x75,0xF5, + 0x0D,0x8D,0x4D,0xCD,0x2D,0xAD,0x6D,0xED,0x1D,0x9D,0x5D,0xDD,0x3D,0xBD,0x7D,0xFD, + 0x03,0x83,0x43,0xC3,0x23,0xA3,0x63,0xE3,0x13,0x93,0x53,0xD3,0x33,0xB3,0x73,0xF3, + 0x0B,0x8B,0x4B,0xCB,0x2B,0xAB,0x6B,0xEB,0x1B,0x9B,0x5B,0xDB,0x3B,0xBB,0x7B,0xFB, + 0x07,0x87,0x47,0xC7,0x27,0xA7,0x67,0xE7,0x17,0x97,0x57,0xD7,0x37,0xB7,0x77,0xF7, + 0x0F,0x8F,0x4F,0xCF,0x2F,0xAF,0x6F,0xEF,0x1F,0x9F,0x5F,0xDF,0x3F,0xBF,0x7F,0xFF + }; + + class catv_transport_framing_enc_bb_impl : public catv_transport_framing_enc_bb + { + private: + unsigned char compute_sum(const unsigned char *bytes); + + public: + catv_transport_framing_enc_bb_impl(); + ~catv_transport_framing_enc_bb_impl(); + + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + }; + + } // namespace dtv +} // namespace gr + +#endif /* INCLUDED_DTV_CATV_TRANSPORT_FRAMING_ENC_BB_IMPL_H */ + diff --git a/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.cc b/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.cc new file mode 100644 index 0000000000..8fdb8722b6 --- /dev/null +++ b/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.cc @@ -0,0 +1,193 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gnuradio/io_signature.h> +#include "catv_trellis_enc_bb_impl.h" + +namespace gr { + namespace dtv { + + catv_trellis_enc_bb::sptr + catv_trellis_enc_bb::make() + { + return gnuradio::get_initial_sptr + (new catv_trellis_enc_bb_impl()); + } + + /* + * The private constructor + */ + catv_trellis_enc_bb_impl::catv_trellis_enc_bb_impl() + : gr::block("catv_trellis_enc_bb", + gr::io_signature::make(1, 1, sizeof(unsigned char)), + gr::io_signature::make(1, 1, sizeof(unsigned char))) + { + set_output_multiple(5); + + init_trellis(); + + Xq = 0; + Yq = 0; + XYp = 0; + } + + /* + * Our virtual destructor. + */ + catv_trellis_enc_bb_impl::~catv_trellis_enc_bb_impl() + { + } + + void + catv_trellis_enc_bb_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required) + { + ninput_items_required[0] = noutput_items / 5 * 4; + } + + void + catv_trellis_enc_bb_impl::diff_precoder(unsigned char W, unsigned char Z, unsigned char *Xp, unsigned char *Yp) + { + unsigned char common, newX, newY; + + common = (Z & (*Xp ^ *Yp)); + newX = W ^ *Xp ^ common; + newY = Z ^ W ^ *Yp ^ common; + + *Xp = newX; + *Yp = newY; + } + + void + catv_trellis_enc_bb_impl::init_trellis() + { + unsigned char XYp, W, Z, X, Y, Xp, Yp, state, xy, Xq; + int i, n; + + for (XYp = 0; XYp < 4; XYp++) { + for (W = 0; W < 16; W++) { + for (Z = 0; Z < 16; Z++) { + X = 0; + Y = 0; + Xp = (XYp & 0b10) >> 1; + Yp = (XYp & 0b01); + for (i = 0; i < 4; i++) { + diff_precoder((W >> i) & 1, (Z >> i) & 1, &Xp, &Yp); + X |= (Xp << i); + Y |= (Yp << i); + } + diff_precoder_table[XYp][W][Z][0] = (Xp << 1) + Yp; + diff_precoder_table[XYp][W][Z][1] = X; + diff_precoder_table[XYp][W][Z][2] = Y; + } + } + } + + for (i = 0; i < 32; i++) { + G1table[i] = (i >> 4) ^ ((i & 0x04) >> 2) ^ (i & 1); + G2table[i] = (i >> 4) ^ ((i & 0x08) >> 3) ^ ((i & 0x04) >> 2) ^ ((i & 0x02) >> 1) ^ (i & 1); + } + + memset(trellis_table_x, 0, 16*16*6); + memset(trellis_table_y, 0, 16*16*6); + for (state = 0; state < 16; state++) { + for (xy = 0; xy < 16; xy++) { + i = 0; + Xq = state; + for (n = 0; n < 4; n++) { + Xq = (Xq << 1) + ((xy >> n) & 1); + + if (n == 3) { + trellis_table_x[state][xy][i+1] |= G1table[Xq] << 3; + trellis_table_y[state][xy][i+1] |= G1table[Xq]; + i += 1; + } + trellis_table_x[state][xy][i+1] |= G2table[Xq] << 3; + trellis_table_y[state][xy][i+1] |= G2table[Xq]; + i += 1; + + Xq &= 0x0F; + } + + trellis_table_x[state][xy][0] = Xq; + trellis_table_y[state][xy][0] = Xq; + } + } + } + + void + catv_trellis_enc_bb_impl::trellis_code(const unsigned char *rs, unsigned char *qs) + { + unsigned char X, Y; + int A, B, n; + + A = (rs[1] << 7) | rs[0]; + B = (rs[3] << 7) | rs[2]; + + memset(qs, 0, 5); + + for (n = 0; n < 5; n++) { + qs[n] |= ((A >> (2*n)) & 3) << 4; + qs[n] |= ((B >> (2*n)) & 3) << 1; + } + + X = diff_precoder_table[XYp][A >> 10][B >> 10][1]; + Y = diff_precoder_table[XYp][A >> 10][B >> 10][2]; + XYp = diff_precoder_table[XYp][A >> 10][B >> 10][0]; + + for (n = 0; n < 5; n++) { + qs[n] |= trellis_table_x[Xq][X][1+n]; + qs[n] |= trellis_table_y[Yq][Y][1+n]; + } + Xq = trellis_table_x[Xq][X][0]; + Yq = trellis_table_y[Yq][Y][0]; + } + + int + catv_trellis_enc_bb_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 unsigned char *in = (const unsigned char *) input_items[0]; + unsigned char *out = (unsigned char *) output_items[0]; + + int i = 0, j = 0; + + while (i < noutput_items) { + trellis_code(in + j, out + i); + i += 5; + j += 4; + } + + // Tell runtime system how many input items we consumed on + // each input stream. + consume_each (j); + + // Tell runtime system how many output items we produced. + return noutput_items; + } + + } /* namespace dtv */ +} /* namespace gr */ + diff --git a/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.h b/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.h new file mode 100644 index 0000000000..aa7874d929 --- /dev/null +++ b/gr-dtv/lib/catv/catv_trellis_enc_bb_impl.h @@ -0,0 +1,60 @@ +/* -*- c++ -*- */ +/* + * Copyright 2016 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_CATV_TRELLIS_ENC_BB_IMPL_H +#define INCLUDED_DTV_CATV_TRELLIS_ENC_BB_IMPL_H + +#include <gnuradio/dtv/catv_trellis_enc_bb.h> + +namespace gr { + namespace dtv { + + class catv_trellis_enc_bb_impl : public catv_trellis_enc_bb + { + private: + unsigned char diff_precoder_table[4][16][16][3]; + unsigned char G1table[32]; + unsigned char G2table[32]; + unsigned char trellis_table_x[16][16][6]; + unsigned char trellis_table_y[16][16][6]; + unsigned char Xq, Yq, XYp; + + void diff_precoder(unsigned char W, unsigned char Z, unsigned char *Xp, unsigned char *Yp); + void init_trellis(); + void trellis_code(const unsigned char *rs, unsigned char *qs); + + public: + catv_trellis_enc_bb_impl(); + ~catv_trellis_enc_bb_impl(); + + // Where all the action really happens + void forecast (int noutput_items, gr_vector_int &ninput_items_required); + + int general_work(int noutput_items, + gr_vector_int &ninput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + }; + + } // namespace dtv +} // namespace gr + +#endif /* INCLUDED_DTV_CATV_TRELLIS_ENC_BB_IMPL_H */ + |