diff options
Diffstat (limited to 'gr-atsc/src/lib/atsci_trellis_encoder.cc')
-rw-r--r-- | gr-atsc/src/lib/atsci_trellis_encoder.cc | 208 |
1 files changed, 0 insertions, 208 deletions
diff --git a/gr-atsc/src/lib/atsci_trellis_encoder.cc b/gr-atsc/src/lib/atsci_trellis_encoder.cc deleted file mode 100644 index 2b3e851bc..000000000 --- a/gr-atsc/src/lib/atsci_trellis_encoder.cc +++ /dev/null @@ -1,208 +0,0 @@ -/* -*- c++ -*- */ -/* - * Copyright 2002,2006 Free Software Foundation, Inc. - * - * This file is part of GNU Radio - * - * GNU Radio 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. - * - * GNU Radio 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 GNU Radio; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include <atsci_trellis_encoder.h> -#include <assert.h> -#include <stdio.h> -#include <string.h> - -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; - -#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). */ -#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}; - - -atsci_trellis_encoder::atsci_trellis_encoder () -{ - debug = false; - reset (); -} - -atsci_trellis_encoder::~atsci_trellis_encoder () -{ -} - -void -atsci_trellis_encoder::reset () -{ - for (int i = 0; i < NCODERS; i++) - enc[i].reset (); -} - -void -atsci_trellis_encoder::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])); - } - - memset (out_copy, 0, sizeof (out_copy)); // FIXME, sanity check - - // do the deed... - encode_helper (out_copy, in_copy); - - // 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 ()); - } -} - -/* - * This code expects contiguous arrrays. Use it as is, it computes - * the correct answer. Maybe someday, when we've run out of better - * things to do, rework to avoid the copying in encode. - */ -void -atsci_trellis_encoder::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? */ - - 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; - } - - 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 */ -#if 0 - assertIntsEqual (0, (INPUT_SIZE * DIBITS_PER_BYTE) % NCODERS, "not %"); - assertIntsEqual (OUTPUT_SIZE, out - output, "outptr"); - assertIntsEqual (NCODERS - ENCODER_SEG_BUMP, encoder, "mux sync"); -#else - assert (0 == (INPUT_SIZE * DIBITS_PER_BYTE) % NCODERS); - assert (OUTPUT_SIZE == out - output); - assert (NCODERS - ENCODER_SEG_BUMP == encoder); -#endif -} - |