From ad20dd2f4313747f187622e6c7bf4fcfe1a98f77 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin <jmvalin@jmvalin.ca> Date: Fri, 28 Oct 2011 12:09:00 -0400 Subject: [PATCH] Preparing for test vectors --- doc/draft-ietf-codec-opus.xml | 50 +++++++++++++++++++- tests/run_vectors.sh | 89 +++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 2 deletions(-) create mode 100755 tests/run_vectors.sh diff --git a/doc/draft-ietf-codec-opus.xml b/doc/draft-ietf-codec-opus.xml index 02b6d87a4..b13cc8266 100644 --- a/doc/draft-ietf-codec-opus.xml +++ b/doc/draft-ietf-codec-opus.xml @@ -6528,11 +6528,51 @@ the latter shall take precedence. <t> Compliance with this specification means that a decoder's output MUST be within the thresholds specified by the opus_compare.c tool (included - with the code) when compared to the reference implementation. Either the floating-point + with the code) when compared to the reference implementation for each of the + test vectors provided (see <xref target="test-vectors"></xref>). Either the floating-point implementation or the fixed-point implementation can be used as a reference and being - within the threshold for one of the two is sufficient. + within the threshold for one of the two is sufficient. In addition, a compilant + decoder implementation MUST have the same final range decoder state as that of the + reference decoder. </t> +<section title="Testing"> +<t> +Using the reference code provided in <xref target="ref-implementation"></xref>, +a mono test vector can be decoded with +<list> +<t>opus_demo -d 48000 1 test_mono.bit test_mono.out</t> +</list> + +If the range decoder state is incorrect for one of the frames, the decoder will exit with +"Error: Range coder state mismatch between encoder and decoder". If the decoder succeeds, then +the output can be compared with the "reference" output with +<list> +<t>opus_compare test_mono.float test_mono.out</t> +</list> +or +<list> +<t>opus_compare test_mono.fixed test_mono.out</t> +</list> + +For a stereo test vector, the command line for decoding is +<list> +<t>opus_demo -d 48000 2 test_stereo.bin test_stereo.out</t> +</list> + +and the output can be compared with the reference output with +<list> +<t>opus_compare -s test_stereo.float test_stereo.out</t> +</list> +or +<list> +<t>opus_compare -s test_stereo.fixed test_stereo.out</t> +</list> +</t> + +</section> + +<section title="Opus Custom"> <t> To complement the Opus specification, the "Opus Custom" codec is defined to handle special sample rates and frame rates that are not supported by the @@ -6543,6 +6583,7 @@ be compatible with the "main" Opus codec. In Opus Custom operation, only the CELT layer is available, which is available using the celt_* function calls in celt.h. </t> +</section> </section> @@ -6891,6 +6932,11 @@ Development snapshots are provided at </t> </section> +<section anchor="test-vectors" title="Test vectors"> +<t> +</t> +</section> + </section> <section anchor="self-delimiting-framing" title="Self-Delimiting Framing"> diff --git a/tests/run_vectors.sh b/tests/run_vectors.sh new file mode 100755 index 000000000..c54c309fe --- /dev/null +++ b/tests/run_vectors.sh @@ -0,0 +1,89 @@ +#!/bin/sh + +CMD_PATH=$1 +VECTOR_PATH=$2 + +OPUS_DEMO=$CMD_PATH/opus_demo +OPUS_COMPARE=$CMD_PATH/opus_compare + +if [ -d $VECTOR_PATH ]; then + echo Test vectors found in $VECTOR_PATH +else + echo No test vectors found + #Don't make the test fail here because the test vectors will be + #distributed separateyl + exit 0 +fi + +if [ -x $OPUS_DEMO ]; then + echo Decoding with $OPUS_DEMO +else + echo ERROR: Decoder not found: $OPUS_DEMO + exit 1 +fi + +echo "==============" +echo Testing mono +echo "==============" +echo + +for file in test1_mono +do + if [ -e $VECTOR_PATH/$file.bit ]; then + echo Testing $file + else + echo Bitstream file not found: $file + fi + if $OPUS_DEMO -d 48000 1 $VECTOR_PATH/$file.bit tmp.out > /dev/null 2>&1; then + echo successfully decoded + else + echo ERROR: decoding failed + exit 1 + fi + $OPUS_COMPARE $VECTOR_PATH/$file.float tmp.out > /dev/null 2>&1 + float_ret=$? + $OPUS_COMPARE $VECTOR_PATH/$file.fixed tmp.out > /dev/null 2>&1 + fixed_ret=$? + if [ "$float_ret" -eq "0" -o "$fixed_ret" -eq "0" ]; then + echo output matches reference + else + echo ERROR: output does not match reference + exit 1 + fi + echo +done + +echo "==============" +echo Testing stereo +echo "==============" +echo + +for file in test1_stereo +do + if [ -e $VECTOR_PATH/$file.bit ]; then + echo Testing $file + else + echo Bitstream file not found: $file + fi + if $OPUS_DEMO -d 48000 2 $VECTOR_PATH/$file.bit tmp.out > /dev/null 2>&1; then + echo successfully decoded + else + echo ERROR: decoding failed + exit 1 + fi + $OPUS_COMPARE -s $VECTOR_PATH/$file.float tmp.out > /dev/null 2>&1 + float_ret=$? + $OPUS_COMPARE -s $VECTOR_PATH/$file.fixed tmp.out > /dev/null 2>&1 + fixed_ret=$? + if [ "$float_ret" -eq "0" -o "$fixed_ret" -eq "0" ]; then + echo output matches reference + else + echo ERROR: output does not match reference + exit 1 + fi + echo +done + + + +echo All tests have passed successfully -- GitLab