summaryrefslogtreecommitdiff
path: root/gr-error-correcting-codes/src/lib/libecc/decoder.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-error-correcting-codes/src/lib/libecc/decoder.cc')
-rw-r--r--gr-error-correcting-codes/src/lib/libecc/decoder.cc161
1 files changed, 124 insertions, 37 deletions
diff --git a/gr-error-correcting-codes/src/lib/libecc/decoder.cc b/gr-error-correcting-codes/src/lib/libecc/decoder.cc
index 0b77f779eb..256880e13f 100644
--- a/gr-error-correcting-codes/src/lib/libecc/decoder.cc
+++ b/gr-error-correcting-codes/src/lib/libecc/decoder.cc
@@ -25,93 +25,180 @@
#endif
#include <decoder.h>
-#include <assert.h>
#include <iostream>
-#define DO_PRINT_DEBUG 1
-
-#if DO_PRINT_DEBUG
-#include <mld/n2bs.h>
-#endif
+#define DO_PRINT_DEBUG 0
/*
* decode a certain number of output bits
*
* the 'in_buf' and 'out_buf' must have enough memory to handle the
- * number of input metrics and output bits; no error checking is done!
+ * number of input items and output bits; no error checking is done!
*
- * n_bits_to_output: the number of bits per output stream to output.
+ * n_bits_to_output: the number of bits per output stream to decode.
*
- * returns the actual number of metrics used per input stream.
+ * returns the actual number of items used per input stream.
*/
size_t
decoder::decode
-(const char** in_buf,
- char** out_buf,
+(const code_input_ptr in_buf,
+ code_output_ptr out_buf,
size_t n_bits_to_output)
{
+ if (in_buf == 0) {
+ std::cerr << "decoder::decode: Error: input buffer is NULL.\n";
+ assert (0);
+ }
+ if (out_buf == 0) {
+ std::cerr << "decoder::decode: Error: output buffer is NULL.\n";
+ assert (0);
+ }
+ if (n_bits_to_output == 0) {
+ std::cerr << "decoder::decode: Warning: no output bits requested.\n";
+ return (0);
+ }
+
// set the class-internal number of input metrics
// and output bits left to decode
- size_t saved_n_input_metrics;
- saved_n_input_metrics = d_n_input_metrics_left =
- compute_n_input_metrics (n_bits_to_output);
- d_n_output_bits_left = n_bits_to_output;
+ d_in_buf = in_buf;
+ d_out_buf = out_buf;
+
+ // check that there are enough output buffer items
+
+ if (d_out_buf->n_items_left() < n_bits_to_output) {
+ std::cerr << "encoder::encode: Warning: output buffer size (" <<
+ d_out_buf->n_items_left() << "is less than the desired number "
+ "of output items (" << n_bits_to_output <<
+ ") ... using lower number.\n";
+ n_bits_to_output = d_out_buf->n_items_left();
+ }
+
+ // check that there are enough input buffer items
+
+ size_t n_items_to_input = compute_n_input_items (n_bits_to_output);
+
+ if (d_in_buf->n_items_left() < n_items_to_input) {
+ std::cerr << "encoder::encode: Warning: input buffer size (" <<
+ d_in_buf->n_items_left() << "is less than the computed number "
+ "of required input items (" << n_items_to_input <<
+ ") ... using lower number.\n";
+ n_items_to_input = d_in_buf->n_items_left();
+ n_bits_to_output = compute_n_output_bits (n_items_to_input);
+ }
+
+ if (DO_PRINT_DEBUG) {
+ std::cout <<
+ "# output bits = " << n_bits_to_output << "\n"
+ "# input items = " << n_items_to_input << "\n";
+ }
// call the private decode function
- decode_private (in_buf, out_buf);
+ decode_private ();
if (DO_PRINT_DEBUG) {
- std::cout << "n_input_metrics_used = " <<
- (saved_n_input_metrics - d_n_input_metrics_left) << "\n"
- "n_output_bits_used = " <<
- (n_bits_to_output - d_n_output_bits_left) << '\n';
+ std::cout <<
+ "# input items used = " << d_in_buf->n_items_used() << "\n"
+ "# output bits used = " << d_out_buf->n_items_used() << "\n";
}
- // return the actual number of input metrics used
+ size_t n_items_used = d_in_buf->n_items_used ();
+
+ // clear these buffers, just in case
+
+ d_in_buf = 0;
+ d_out_buf = 0;
- return (saved_n_input_metrics - d_n_input_metrics_left);
+ // return the actual number of input bits used
+
+ return (n_items_used);
}
/*
* decode a certain number of input metrics
*
* the 'in_buf' and 'out_buf' must have enough memory to handle the
- * number of input metrics and output bits; no error checking is done!
+ * number of input items and output bits; no error checking is done!
*
- * n_metrics_to_input: the number of metrics per input stream to decode
+ * n_items_to_input: the number of items per input stream to decode
*
* returns the actual number of bits written per output stream
*/
size_t
decoder::decode
-(const char** in_buf,
- size_t n_metrics_to_input,
- char** out_buf)
+(const code_input_ptr in_buf,
+ size_t n_items_to_input,
+ code_output_ptr out_buf)
{
+ if (in_buf == 0) {
+ std::cerr << "encoder::encode: Error: input buffer is NULL.\n";
+ assert (0);
+ }
+ if (out_buf == 0) {
+ std::cerr << "encoder::encode: Error: output buffer is NULL.\n";
+ assert (0);
+ }
+ if (n_items_to_input == 0) {
+ std::cerr << "encoder::encode: Warning: no input items requested.\n";
+ return (0);
+ }
+
// set the class-internal number of input metrics and
// output bits left to decode
- size_t saved_n_output_bits;
- saved_n_output_bits = d_n_output_bits_left =
- compute_n_output_bits (n_metrics_to_input);
- d_n_input_metrics_left = n_metrics_to_input;
+ d_in_buf = in_buf;
+ d_out_buf = out_buf;
+
+ // check that there are enough input buffer items
+
+ if (d_in_buf->n_items_left() < n_items_to_input) {
+ std::cerr << "encoder::encode: Warning: input buffer size (" <<
+ d_in_buf->n_items_left() << "is less than the desired number "
+ "of input items (" << n_items_to_input <<
+ ") ... using lower number.\n";
+ n_items_to_input = d_in_buf->n_items_left();
+ }
+
+ // check that there are enough output buffer items
+
+ size_t n_bits_to_output = compute_n_output_bits (n_items_to_input);
+
+ if (d_out_buf->n_items_left() < n_bits_to_output) {
+ std::cerr << "encoder::encode: Warning: output buffer size (" <<
+ d_out_buf->n_items_left() << "is less than the computed number "
+ "of required output items (" << n_bits_to_output <<
+ ") ... using lower number.\n";
+ n_bits_to_output = d_out_buf->n_items_left();
+ n_items_to_input = compute_n_input_items (n_bits_to_output);
+ }
+
+ if (DO_PRINT_DEBUG) {
+ std::cout <<
+ "# output bits = " << n_bits_to_output << "\n"
+ "# input items = " << n_items_to_input << "\n";
+ }
// call the private decode function
- decode_private (in_buf, out_buf);
+ decode_private ();
if (DO_PRINT_DEBUG) {
- std::cout << "n_input_metrics_used = " <<
- (n_metrics_to_input - d_n_input_metrics_left) << '\n';
- std::cout << "n_output_bits_used = " <<
- (saved_n_output_bits - d_n_output_bits_left) << '\n';
+ std::cout <<
+ "# input items used = " << d_in_buf->n_items_used() << "\n"
+ "# output bits used = " << d_out_buf->n_items_used() << "\n";
}
+ size_t n_items_used = d_out_buf->n_items_used();
+
+ // clear these buffers, just in case
+
+ d_in_buf = 0;
+ d_out_buf = 0;
+
// return the actual number of output bits written
- return (saved_n_output_bits - d_n_output_bits_left);
+ return (n_items_used);
}