diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2008-06-20 21:45:50 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2008-06-20 21:45:50 +0000 |
commit | 28789d42d78ebffb91dac00facc6bee334d8dd8f (patch) | |
tree | 0997bd66640798a115e32b6d6b0ecd7bf9b9c377 /pjsip-apps/src/test-pjsua | |
parent | dcadef7fc04bb899333fb0ab472679c8ac280e09 (diff) |
More ticket #543: added PESQ test
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@2038 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip-apps/src/test-pjsua')
-rw-r--r-- | pjsip-apps/src/test-pjsua/mod_pesq.py | 130 | ||||
-rw-r--r-- | pjsip-apps/src/test-pjsua/scripts-pesq/100_defaults.py | 12 |
2 files changed, 142 insertions, 0 deletions
diff --git a/pjsip-apps/src/test-pjsua/mod_pesq.py b/pjsip-apps/src/test-pjsua/mod_pesq.py new file mode 100644 index 00000000..3527dce9 --- /dev/null +++ b/pjsip-apps/src/test-pjsua/mod_pesq.py @@ -0,0 +1,130 @@ +# $Id$ + +# Quality test of media calls. +# - UA1 calls UA2 +# - UA1 plays a file until finished to be streamed to UA2 +# - UA2 records from stream +# - Apply PESQ to played file (reference) and recorded file (degraded) +# +# File should be: +# - naming: xxxxxx.CLOCK_RATE.wav, e.g: test1.8.wav +# - clock-rate of those files can only be 8khz or 16khz + +import time +import imp +import sys +import re +import subprocess +import inc_const as const + +from inc_cfg import * + +# Load configuration +cfg_file = imp.load_source("cfg_file", sys.argv[2]) + +# PESQ configs +# PESQ_THRESHOLD specifies the minimum acceptable PESQ MOS value, so test can be declared successful +PESQ = "tools/pesq.exe" +PESQ_THRESHOLD = 1.0 + +# UserData +class mod_pesq_user_data: + # Sample rate option for PESQ + pesq_sample_rate_opt = "" + # Input/Reference filename + input_filename = "" + # Output/Degraded filename + output_filename = "" + +# Test body function +def test_func(t, user_data): + # module debugging purpose + #user_data.pesq_sample_rate_opt = "+16000" + #user_data.input_filename = "wavs/input.16.wav" + #user_data.output_filename = "wavs/tmp.16.wav" + #return + + ua1 = t.process[0] + ua2 = t.process[1] + + # Get conference clock rate of UA2 for PESQ sample rate option + ua2.send("cl") + clock_rate_line = ua2.expect("Port \#00\[\d+KHz") + if (clock_rate_line == None): + raise TestError("Failed getting") + clock_rate = re.match("Port \#00\[(\d+)KHz", clock_rate_line).group(1) + user_data.pesq_sample_rate_opt = "+" + clock_rate + "000" + + # Get input file name + ua1.sync_stdout() + ua1.send("dc") + line = ua1.expect(const.MEDIA_PLAY_FILE) + user_data.input_filename = re.compile(const.MEDIA_PLAY_FILE).match(line).group(1) + + # Get output file name + ua2.sync_stdout() + ua2.send("dc") + line = ua2.expect(const.MEDIA_REC_FILE) + user_data.output_filename = re.compile(const.MEDIA_REC_FILE).match(line).group(1) + + # Find appropriate clock rate for the input file + clock_rate = re.compile(".+(\.\d+\.wav)$").match(user_data.output_filename) + if (clock_rate==None): + raise TestError("Cannot compare input & output, incorrect output filename format") + user_data.input_filename = re.sub("\.\d+\.wav$", clock_rate.group(1), user_data.input_filename) + + time.sleep(1) + ua1.sync_stdout() + ua2.sync_stdout() + + # UA1 making call + ua1.send("m") + ua1.send(t.inst_params[1].uri) + ua1.expect(const.STATE_CALLING) + + # Auto answer, auto play, auto hangup + # Just wait for call disconnected + + if ua1.expect(const.STATE_CONFIRMED, False)==None: + raise TestError("Call failed") + ua2.expect(const.STATE_CONFIRMED) + + while True: + line = ua2.proc.stdout.readline() + if line == "": + raise TestError(ua2.name + ": Premature EOF") + # Search for disconnected text + if re.search(const.STATE_DISCONNECTED, line) != None: + break + + +# Post body function +def post_func(t, user_data): + endpt = t.process[0] + + # Execute PESQ + fullcmd = PESQ + " " + user_data.pesq_sample_rate_opt + " " + user_data.input_filename + " " + user_data.output_filename + endpt.trace("Popen " + fullcmd) + pesq_proc = subprocess.Popen(fullcmd, stdout=subprocess.PIPE, universal_newlines=True) + pesq_out = pesq_proc.communicate() + + # Parse ouput + mo_pesq_out = re.compile("Prediction\s+:\s+PESQ_MOS\s+=\s+(.+)\s*").search(pesq_out[0]) + if (mo_pesq_out == None): + raise TestError("Failed to fetch PESQ result") + + # Evaluate the similarity value + pesq_res = mo_pesq_out.group(1) + if (pesq_res >= PESQ_THRESHOLD): + endpt.trace("Success, PESQ result=" + pesq_res) + else: + endpt.trace("Failed, PESQ result=" + pesq_res) + raise TestError("WAV seems to be degraded badly") + + +# Here where it all comes together +test = cfg_file.test_param +test.test_func = test_func +test.post_func = post_func +test.user_data = mod_pesq_user_data() + diff --git a/pjsip-apps/src/test-pjsua/scripts-pesq/100_defaults.py b/pjsip-apps/src/test-pjsua/scripts-pesq/100_defaults.py new file mode 100644 index 00000000..c8c1aa5e --- /dev/null +++ b/pjsip-apps/src/test-pjsua/scripts-pesq/100_defaults.py @@ -0,0 +1,12 @@ +# $Id$ +# +from inc_cfg import * + +# Simple call +test_param = TestParam( + "PESQ", + [ + InstanceParam("UA1", "--null-audio --max-calls=1 --play-file wavs/input.16.wav --auto-play-hangup"), + InstanceParam("UA2", "--null-audio --max-calls=1 --rec-file wavs/tmp.16.wav --clock-rate 16000 --auto-answer 200 --auto-rec") + ] + ) |