summaryrefslogtreecommitdiff
path: root/pjmedia/src/test
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2009-04-18 11:49:54 +0000
committerBenny Prijono <bennylp@teluu.com>2009-04-18 11:49:54 +0000
commita1af7e95f02cb3744d53b17671ce52cfb5edc7f8 (patch)
tree7a5d92a9d01ff3f975e79717298cb18b15c99b60 /pjmedia/src/test
parenta9881591ed3197d05013342bd103102cc949120c (diff)
More ticket #774: added more ITU test vectors for siren codecs
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2615 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src/test')
-rw-r--r--pjmedia/src/test/codec_vectors.c180
-rw-r--r--pjmedia/src/test/vectors/g722_1_dec_in_24000_fe.itubin0 -> 309444 bytes
-rw-r--r--pjmedia/src/test/vectors/g722_1_dec_in_32000_fe.itubin0 -> 412164 bytes
-rw-r--r--pjmedia/src/test/vectors/g722_1_dec_out_24000_fe.pcmbin0 -> 205440 bytes
-rw-r--r--pjmedia/src/test/vectors/g722_1_dec_out_32000_fe.pcmbin0 -> 205440 bytes
5 files changed, 153 insertions, 27 deletions
diff --git a/pjmedia/src/test/codec_vectors.c b/pjmedia/src/test/codec_vectors.c
index dc6333cd..7bf3b38c 100644
--- a/pjmedia/src/test/codec_vectors.c
+++ b/pjmedia/src/test/codec_vectors.c
@@ -22,11 +22,15 @@
#define THIS_FILE "codec_vectors.c"
#define TMP_OUT "output.tmp"
+/*
+ * Encode test. Read input from WAV file, encode to temporary output file,
+ * and compare the temporary output file to the reference file.
+ */
static int codec_test_encode(pjmedia_codec_mgr *mgr,
char *codec_name,
unsigned bitrate,
const char *wav_file,
- const char *ref_file)
+ const char *ref_encoded_file)
{
pj_str_t codec_id = pj_str(codec_name);
pj_pool_t *pool = NULL;
@@ -131,7 +135,7 @@ static int codec_test_encode(pjmedia_codec_mgr *mgr,
output = NULL;
/* Compare encoded files */
- fref = fopen(ref_file, "rb");
+ fref = fopen(ref_encoded_file, "rb");
if (!fref) {
rc = -100;
goto on_return;
@@ -195,13 +199,86 @@ on_return:
}
+/*
+ * Read file in ITU format (".itu" extension).
+ *
+ * Set swap_endian to TRUE if the ITU file is stored in little
+ * endian format (normally true).
+ */
+static int read_ITU_format(FILE *fp_bitstream,
+ short *out_words,
+ short *p_frame_error_flag,
+ int number_of_16bit_words_per_frame,
+ pj_bool_t swap_endian)
+{
+ enum { MAX_BITS_PER_FRAME = 160*8 };
+ short i,j;
+ short nsamp;
+ short packed_word;
+ short bit_count;
+ short bit;
+ short in_array[MAX_BITS_PER_FRAME+2];
+ short one = 0x0081;
+ short zero = 0x007f;
+ short frame_start = 0x6b21;
+
+ nsamp = fread(in_array, 2, 2 + 16*number_of_16bit_words_per_frame,
+ fp_bitstream);
+
+ j = 0;
+ bit = in_array[j++];
+ if (bit != frame_start) {
+ *p_frame_error_flag = 1;
+ } else {
+ *p_frame_error_flag = 0;
+
+ /* increment j to skip over the number of bits in frame */
+ j++;
+
+ for (i=0; i<number_of_16bit_words_per_frame; i++) {
+ packed_word = 0;
+ bit_count = 15;
+ while (bit_count >= 0) {
+ bit = in_array[j++];
+ if (bit == zero)
+ bit = 0;
+ else if (bit == one)
+ bit = 1;
+ else
+ *p_frame_error_flag = 1;
+
+ packed_word <<= 1;
+ packed_word = (short )(packed_word + bit);
+ bit_count--;
+ }
+
+ if (swap_endian)
+ out_words[i] = pj_ntohs(packed_word);
+ else
+ out_words[i] = packed_word;
+ }
+ }
+ return (nsamp-1)/16;
+}
+
+/*
+ * Decode test
+ *
+ * Decode the specified encoded file in "in_encoded_file" into temporary
+ * PCM output file, and compare the temporary PCM output file with
+ * the PCM reference file.
+ *
+ * Some reference file requires manipulation to the PCM output
+ * before comparison, such manipulation can be done by supplying
+ * this function with the "manip" function.
+ */
static int codec_test_decode(pjmedia_codec_mgr *mgr,
char *codec_name,
unsigned bitrate,
unsigned encoded_len,
- const char *in_file,
- const char *ref_file,
+ const char *in_encoded_file,
+ const char *ref_pcm_file,
void (*manip)(short *pcm, unsigned count))
{
pj_str_t codec_id = pj_str(codec_name);
@@ -213,6 +290,7 @@ static int codec_test_decode(pjmedia_codec_mgr *mgr,
pjmedia_frame out_frame;
void *pkt;
FILE *input = NULL, *output = NULL, *fref = NULL;
+ pj_bool_t is_itu_format = PJ_FALSE;
int rc = 0;
pj_status_t status;
@@ -258,12 +336,16 @@ static int codec_test_decode(pjmedia_codec_mgr *mgr,
}
/* Open input file */
- input = fopen(in_file, "rb");
+ input = fopen(in_encoded_file, "rb");
if (!input) {
rc = -80;
goto on_return;
}
+ /* Is the file in ITU format? */
+ is_itu_format = pj_ansi_stricmp(in_encoded_file+strlen(in_encoded_file)-4,
+ ".itu")==0;
+
/* Open output file */
output = fopen(TMP_OUT, "wb");
if (!output) {
@@ -281,24 +363,52 @@ static int codec_test_decode(pjmedia_codec_mgr *mgr,
pjmedia_frame in_frame[2];
pj_timestamp ts;
unsigned count;
+ pj_bool_t has_frame;
- if (fread(pkt, encoded_len, 1, input) != 1)
- break;
+ if (is_itu_format) {
+ int nsamp;
+ short frame_err = 0;
- count = 2;
- if (codec->op->parse(codec, pkt, encoded_len, &ts, &count, in_frame) != PJ_SUCCESS) {
- rc = -100;
- goto on_return;
- }
+ nsamp = read_ITU_format(input, (short*)pkt, &frame_err,
+ encoded_len / 2, PJ_TRUE);
+ if (nsamp != (int)encoded_len / 2)
+ break;
- if (count != 1) {
- rc = -110;
- goto on_return;
+ has_frame = !frame_err;
+ } else {
+ if (fread(pkt, encoded_len, 1, input) != 1)
+ break;
+
+ has_frame = PJ_TRUE;
}
- if (codec->op->decode(codec, &in_frame[0], samples_per_frame*2, &out_frame) != PJ_SUCCESS) {
- rc = -120;
- goto on_return;
+ if (has_frame) {
+ count = 2;
+ if (codec->op->parse(codec, pkt, encoded_len, &ts,
+ &count, in_frame) != PJ_SUCCESS)
+ {
+ rc = -100;
+ goto on_return;
+ }
+
+ if (count != 1) {
+ rc = -110;
+ goto on_return;
+ }
+
+ if (codec->op->decode(codec, &in_frame[0], samples_per_frame*2,
+ &out_frame) != PJ_SUCCESS)
+ {
+ rc = -120;
+ goto on_return;
+ }
+ } else {
+ if (codec->op->recover(codec, samples_per_frame*2,
+ &out_frame) != PJ_SUCCESS)
+ {
+ rc = -125;
+ goto on_return;
+ }
}
if (manip)
@@ -317,7 +427,7 @@ static int codec_test_decode(pjmedia_codec_mgr *mgr,
output = NULL;
/* Compare encoded files */
- fref = fopen(ref_file, "rb");
+ fref = fopen(ref_pcm_file, "rb");
if (!fref) {
rc = -140;
goto on_return;
@@ -399,7 +509,7 @@ int codec_test_vectors(void)
char *codec_name;
unsigned bit_rate;
const char *wav_file;
- const char *ref_file;
+ const char *ref_encoded_file;
} enc_vectors[] =
{
#if PJMEDIA_HAS_G7221_CODEC
@@ -420,7 +530,7 @@ int codec_test_vectors(void)
unsigned encoded_frame_len;
void (*manip)(short *pcm, unsigned count);
const char *enc_file;
- const char *ref_file;
+ const char *ref_pcm_file;
} dec_vectors[] =
{
#if PJMEDIA_HAS_G7221_CODEC
@@ -434,6 +544,16 @@ int codec_test_vectors(void)
"../src/test/vectors/g722_1_enc_out_32000_be.pak",
"../src/test/vectors/g722_1_dec_out_32000.pcm"
},
+ { "G7221/16000/1", 24000, 60,
+ &g7221_pcm_manip,
+ "../src/test/vectors/g722_1_dec_in_24000_fe.itu",
+ "../src/test/vectors/g722_1_dec_out_24000_fe.pcm"
+ },
+ { "G7221/16000/1", 32000, 80,
+ &g7221_pcm_manip,
+ "../src/test/vectors/g722_1_dec_in_32000_fe.itu",
+ "../src/test/vectors/g722_1_dec_out_32000_fe.pcm"
+ },
#endif
{ NULL }
};
@@ -456,29 +576,35 @@ int codec_test_vectors(void)
PJ_LOG(3,(THIS_FILE," encode tests:"));
for (i=0; i<PJ_ARRAY_SIZE(enc_vectors); ++i) {
- PJ_LOG(3,(THIS_FILE," %s @%d bps", enc_vectors[i].codec_name,
- enc_vectors[i].bit_rate));
if (!enc_vectors[i].codec_name)
continue;
+ PJ_LOG(3,(THIS_FILE," %s @%d bps %s ==> %s",
+ enc_vectors[i].codec_name,
+ enc_vectors[i].bit_rate,
+ enc_vectors[i].wav_file,
+ enc_vectors[i].ref_encoded_file));
rc = codec_test_encode(mgr, enc_vectors[i].codec_name,
enc_vectors[i].bit_rate,
enc_vectors[i].wav_file,
- enc_vectors[i].ref_file);
+ enc_vectors[i].ref_encoded_file);
if (rc != 0)
rc_final = rc;
}
PJ_LOG(3,(THIS_FILE," decode tests:"));
for (i=0; i<PJ_ARRAY_SIZE(dec_vectors); ++i) {
- PJ_LOG(3,(THIS_FILE," %s @%d bps", dec_vectors[i].codec_name,
- dec_vectors[i].bit_rate));
if (!dec_vectors[i].codec_name)
continue;
+ PJ_LOG(3,(THIS_FILE," %s @%d bps %s ==> %s",
+ dec_vectors[i].codec_name,
+ dec_vectors[i].bit_rate,
+ dec_vectors[i].enc_file,
+ dec_vectors[i].ref_pcm_file));
rc = codec_test_decode(mgr, dec_vectors[i].codec_name,
dec_vectors[i].bit_rate,
dec_vectors[i].encoded_frame_len,
dec_vectors[i].enc_file,
- dec_vectors[i].ref_file,
+ dec_vectors[i].ref_pcm_file,
dec_vectors[i].manip);
if (rc != 0)
rc_final = rc;
diff --git a/pjmedia/src/test/vectors/g722_1_dec_in_24000_fe.itu b/pjmedia/src/test/vectors/g722_1_dec_in_24000_fe.itu
new file mode 100644
index 00000000..d419b45b
--- /dev/null
+++ b/pjmedia/src/test/vectors/g722_1_dec_in_24000_fe.itu
Binary files differ
diff --git a/pjmedia/src/test/vectors/g722_1_dec_in_32000_fe.itu b/pjmedia/src/test/vectors/g722_1_dec_in_32000_fe.itu
new file mode 100644
index 00000000..56a77463
--- /dev/null
+++ b/pjmedia/src/test/vectors/g722_1_dec_in_32000_fe.itu
Binary files differ
diff --git a/pjmedia/src/test/vectors/g722_1_dec_out_24000_fe.pcm b/pjmedia/src/test/vectors/g722_1_dec_out_24000_fe.pcm
new file mode 100644
index 00000000..5bcbe406
--- /dev/null
+++ b/pjmedia/src/test/vectors/g722_1_dec_out_24000_fe.pcm
Binary files differ
diff --git a/pjmedia/src/test/vectors/g722_1_dec_out_32000_fe.pcm b/pjmedia/src/test/vectors/g722_1_dec_out_32000_fe.pcm
new file mode 100644
index 00000000..f76548d1
--- /dev/null
+++ b/pjmedia/src/test/vectors/g722_1_dec_out_32000_fe.pcm
Binary files differ