freeswitch/libs/spandsp/tests/bitstream_tests.c
Steve Underwood 365fc08719 Changed spandsp from using TRUE and FALSE to using C99 true and false. It seems
like the quirks we used to get using those with C++ have gone away.
2013-08-08 21:40:28 +08:00

188 lines
5.0 KiB
C

/*
* SpanDSP - a series of DSP components for telephony
*
* bitstream_tests.c
*
* Written by Steve Underwood <steveu@coppice.org>
*
* Copyright (C) 2007 Steve Underwood
*
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2, as
* published by the Free Software Foundation.
*
* This program 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 program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*! \page bitstream_tests_page Bitstream tests
\section bitstream_tests_page_sec_1 What does it do?
\section bitstream_tests_page_sec_2 How is it used?
*/
#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <assert.h>
#define SPANDSP_EXPOSE_INTERNAL_STRUCTURES
#include "spandsp.h"
uint8_t buffer[256];
#define PATTERN 0x1111111
#define SEQUENCE_LENGTH 17
uint8_t left[] =
{
0x28, /* 2 of 4, 3, 2, 1 */
0xC8, /* 1 of 6, 5, 2 of 4 */
0xAE, /* 3 of 7, 5 of 6 */
0x67, /* 4 of 8, 4 of 7 */
0x74, /* 4 of 9, 4 of 8 */
0x43, /* 3 of 10, 5 of 9 */
0x32, /* 1 of 11, 7 of 10 */
0xAA, /* 8 of 11 */
0xAE, /* 6 of 12, 2 of 11 */
0xED, /* 2 of 13, 6 of 12 */
0x99, /* 8 of 13 */
0x8E, /* 5 of 14, 3 of 13 */
0xEE, /* 8 of 14 */
0xEE, /* 7 of 15, 1 of 14 */
0xEE, /* 8 of 15 */
0xFF, /* 8 of 16 */
0xFF, /* 8 of 16 */
0x88, /* 8 of 17 */
0x88, /* 8 of 17 */
0x00 /* 1 of 17 */
};
uint8_t right[] =
{
0xD2, /* 1, 2, 3, 2 of 4 */
0x90, /* 2 of 4, 5, 1 of 6 */
0xCA, /* 5 of 6, 3 of 7 */
0x7C, /* 4 of 7, 4 of 8 */
0x87, /* 4 of 8, 4 of 9 */
0x28, /* 5 of 9, 3 of 10 */
0x33, /* 7 of 10, 1 of 11 */
0x55, /* 8 of 11 */
0xED, /* 2 of 11, 6 of 12 */
0x2E, /* 6 of 12, 2 of 13 */
0x33, /* 8 of 13 */
0xEB, /* 3 of 13, 5 of 14 */
0xEE, /* 8 of 14 */
0xDC, /* 1 of 14, 7 of 15 */
0xDD, /* 8 of 15 */
0xFF, /* 8 of 16 */
0xFF, /* 8 of 16 */
0x10, /* 8 of 17 */
0x11, /* 8 of 17 */
0x01 /* 1 of 17 */
};
int main(int argc, char *argv[])
{
int i;
bitstream_state_t state;
bitstream_state_t *s;
const uint8_t *r;
uint8_t *w;
uint8_t *cc;
unsigned int x;
int total_bits;
s = bitstream_init(&state, true);
w = buffer;
total_bits = 0;
for (i = 0; i < SEQUENCE_LENGTH; i++)
{
bitstream_put(s, &w, i*PATTERN, i + 1);
total_bits += (i + 1);
}
bitstream_flush(s, &w);
printf("%d bits written\n", total_bits);
for (cc = buffer; cc < w; cc++)
printf("%02X ", *cc);
printf("\n");
for (cc = right; cc < right + sizeof(right); cc++)
printf("%02X ", *cc);
printf("\n");
if ((w - buffer) != sizeof(right) || memcmp(buffer, right, sizeof(right)))
{
printf("Test failed\n");
exit(2);
}
s = bitstream_init(&state, true);
r = buffer;
for (i = 0; i < SEQUENCE_LENGTH; i++)
{
x = bitstream_get(s, &r, i + 1);
if (x != ((PATTERN*i) & ((1 << (i + 1)) - 1)))
{
printf("Error 0x%X 0x%X\n", x, ((PATTERN*i) & ((1 << (i + 1)) - 1)));
printf("Test failed\n");
exit(2);
}
}
s = bitstream_init(&state, false);
w = buffer;
total_bits = 0;
for (i = 0; i < SEQUENCE_LENGTH; i++)
{
bitstream_put(s, &w, PATTERN*i, i + 1);
total_bits += (i + 1);
}
bitstream_flush(s, &w);
printf("%d bits written\n", total_bits);
for (cc = buffer; cc < w; cc++)
printf("%02X ", *cc);
printf("\n");
for (cc = left; cc < left + sizeof(left); cc++)
printf("%02X ", *cc);
printf("\n");
if ((w - buffer) != sizeof(left) || memcmp(buffer, left, sizeof(left)))
{
printf("Test failed\n");
exit(2);
}
s = bitstream_init(&state, false);
r = buffer;
for (i = 0; i < SEQUENCE_LENGTH; i++)
{
x = bitstream_get(s, &r, i + 1);
if (x != ((PATTERN*i) & ((1 << (i + 1)) - 1)))
{
printf("Error 0x%X 0x%X\n", x, ((PATTERN*i) & ((1 << (i + 1)) - 1)));
printf("Test failed\n");
exit(2);
}
}
printf("Tests passed.\n");
return 0;
}
/*- End of function --------------------------------------------------------*/
/*- End of file ------------------------------------------------------------*/