summaryrefslogtreecommitdiff
path: root/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc')
-rw-r--r--gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc151
1 files changed, 151 insertions, 0 deletions
diff --git a/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc b/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc
new file mode 100644
index 0000000000..03dd0ffec5
--- /dev/null
+++ b/gr-dtv/lib/dvbt/dvbt_energy_dispersal_impl.cc
@@ -0,0 +1,151 @@
+/* -*- 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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <gnuradio/io_signature.h>
+#include "dvbt_energy_dispersal_impl.h"
+#include <stdio.h>
+
+namespace gr {
+ namespace dtv {
+
+ const int dvbt_energy_dispersal_impl::d_npacks = 8;
+ const int dvbt_energy_dispersal_impl::d_psize = 188;
+ const int dvbt_energy_dispersal_impl::d_SYNC = 0x47;
+ const int dvbt_energy_dispersal_impl::d_NSYNC = 0xB8;
+
+ void
+ dvbt_energy_dispersal_impl::init_prbs()
+ {
+ d_reg = 0xa9;
+ }
+
+ int
+ dvbt_energy_dispersal_impl::clock_prbs(int clocks)
+ {
+ int res = 0;
+ int feedback = 0;
+
+ for (int i = 0; i < clocks; i++) {
+ feedback = ((d_reg >> (14 - 1)) ^ (d_reg >> (15 - 1))) & 0x1;
+ d_reg = ((d_reg << 1) | feedback) & 0x7fff;
+ res = (res << 1) | feedback;
+ }
+ return res;
+ }
+
+ dvbt_energy_dispersal::sptr
+ dvbt_energy_dispersal::make(int nblocks)
+ {
+ return gnuradio::get_initial_sptr
+ (new dvbt_energy_dispersal_impl(nblocks));
+ }
+
+ /*
+ * The private constructor
+ */
+ dvbt_energy_dispersal_impl::dvbt_energy_dispersal_impl(int nblocks)
+ : gr::block("dvbt_energy_dispersal",
+ gr::io_signature::make(1, 1, sizeof(unsigned char)),
+ gr::io_signature::make(1, 1, sizeof(unsigned char) * nblocks * d_npacks * d_psize)),
+ d_nblocks(nblocks),
+ d_reg(0xa9)
+ {
+ set_relative_rate(1.0/(double) (d_nblocks * d_npacks * d_psize));
+ }
+
+ /*
+ * Our virtual destructor.
+ */
+ dvbt_energy_dispersal_impl::~dvbt_energy_dispersal_impl()
+ {
+ }
+
+ void
+ dvbt_energy_dispersal_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
+ {
+ // Add one block size for SYNC search
+ ninput_items_required[0] = d_npacks * (d_psize + 1) * d_nblocks * noutput_items;
+ }
+
+ int
+ dvbt_energy_dispersal_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 index = 0;
+ int count = 0;
+ int ret = 0;
+ int is_sync = 0;
+
+ // Search for SYNC byte
+ while (is_sync == 0 && index < d_psize) {
+ if (in[index] == d_SYNC) {
+ is_sync = 1;
+ }
+ else {
+ index++;
+ }
+ }
+
+ // If we found a SYNC byte
+ if (is_sync) {
+ for (int i = 0; i < (d_nblocks * noutput_items); i++) {
+ init_prbs();
+
+ int sync = d_NSYNC;
+
+ for (int j = 0; j < d_npacks; j++) {
+ if (in[index + count] != d_SYNC) {
+ printf("error: Malformed MPEG-TS!\n");
+ }
+
+ out[count++] = sync;
+
+ for (int k = 1; k < d_psize; k++) {
+ out[count] = in[index + count] ^ clock_prbs(d_npacks);
+ count++;
+ }
+
+ sync = d_SYNC;
+ clock_prbs(d_npacks);
+ }
+ }
+ consume_each(index + d_npacks * d_psize * d_nblocks * noutput_items);
+ ret = noutput_items;
+ }
+ else {
+ consume_each(index);
+ ret = 0;
+ }
+
+ // Tell runtime system how many output items we produced.
+ return ret;
+ }
+ } /* namespace dtv */
+} /* namespace gr */
+