blob: 3527dce9e2817f9838899e5b91a36e50245f6519 [file] [log] [blame]
Nanang Izzuddinb6133fb2008-06-20 21:45:50 +00001# $Id$
2
3# Quality test of media calls.
4# - UA1 calls UA2
5# - UA1 plays a file until finished to be streamed to UA2
6# - UA2 records from stream
7# - Apply PESQ to played file (reference) and recorded file (degraded)
8#
9# File should be:
10# - naming: xxxxxx.CLOCK_RATE.wav, e.g: test1.8.wav
11# - clock-rate of those files can only be 8khz or 16khz
12
13import time
14import imp
15import sys
16import re
17import subprocess
18import inc_const as const
19
20from inc_cfg import *
21
22# Load configuration
23cfg_file = imp.load_source("cfg_file", sys.argv[2])
24
25# PESQ configs
26# PESQ_THRESHOLD specifies the minimum acceptable PESQ MOS value, so test can be declared successful
27PESQ = "tools/pesq.exe"
28PESQ_THRESHOLD = 1.0
29
30# UserData
31class mod_pesq_user_data:
32 # Sample rate option for PESQ
33 pesq_sample_rate_opt = ""
34 # Input/Reference filename
35 input_filename = ""
36 # Output/Degraded filename
37 output_filename = ""
38
39# Test body function
40def test_func(t, user_data):
41 # module debugging purpose
42 #user_data.pesq_sample_rate_opt = "+16000"
43 #user_data.input_filename = "wavs/input.16.wav"
44 #user_data.output_filename = "wavs/tmp.16.wav"
45 #return
46
47 ua1 = t.process[0]
48 ua2 = t.process[1]
49
50 # Get conference clock rate of UA2 for PESQ sample rate option
51 ua2.send("cl")
52 clock_rate_line = ua2.expect("Port \#00\[\d+KHz")
53 if (clock_rate_line == None):
54 raise TestError("Failed getting")
55 clock_rate = re.match("Port \#00\[(\d+)KHz", clock_rate_line).group(1)
56 user_data.pesq_sample_rate_opt = "+" + clock_rate + "000"
57
58 # Get input file name
59 ua1.sync_stdout()
60 ua1.send("dc")
61 line = ua1.expect(const.MEDIA_PLAY_FILE)
62 user_data.input_filename = re.compile(const.MEDIA_PLAY_FILE).match(line).group(1)
63
64 # Get output file name
65 ua2.sync_stdout()
66 ua2.send("dc")
67 line = ua2.expect(const.MEDIA_REC_FILE)
68 user_data.output_filename = re.compile(const.MEDIA_REC_FILE).match(line).group(1)
69
70 # Find appropriate clock rate for the input file
71 clock_rate = re.compile(".+(\.\d+\.wav)$").match(user_data.output_filename)
72 if (clock_rate==None):
73 raise TestError("Cannot compare input & output, incorrect output filename format")
74 user_data.input_filename = re.sub("\.\d+\.wav$", clock_rate.group(1), user_data.input_filename)
75
76 time.sleep(1)
77 ua1.sync_stdout()
78 ua2.sync_stdout()
79
80 # UA1 making call
81 ua1.send("m")
82 ua1.send(t.inst_params[1].uri)
83 ua1.expect(const.STATE_CALLING)
84
85 # Auto answer, auto play, auto hangup
86 # Just wait for call disconnected
87
88 if ua1.expect(const.STATE_CONFIRMED, False)==None:
89 raise TestError("Call failed")
90 ua2.expect(const.STATE_CONFIRMED)
91
92 while True:
93 line = ua2.proc.stdout.readline()
94 if line == "":
95 raise TestError(ua2.name + ": Premature EOF")
96 # Search for disconnected text
97 if re.search(const.STATE_DISCONNECTED, line) != None:
98 break
99
100
101# Post body function
102def post_func(t, user_data):
103 endpt = t.process[0]
104
105 # Execute PESQ
106 fullcmd = PESQ + " " + user_data.pesq_sample_rate_opt + " " + user_data.input_filename + " " + user_data.output_filename
107 endpt.trace("Popen " + fullcmd)
108 pesq_proc = subprocess.Popen(fullcmd, stdout=subprocess.PIPE, universal_newlines=True)
109 pesq_out = pesq_proc.communicate()
110
111 # Parse ouput
112 mo_pesq_out = re.compile("Prediction\s+:\s+PESQ_MOS\s+=\s+(.+)\s*").search(pesq_out[0])
113 if (mo_pesq_out == None):
114 raise TestError("Failed to fetch PESQ result")
115
116 # Evaluate the similarity value
117 pesq_res = mo_pesq_out.group(1)
118 if (pesq_res >= PESQ_THRESHOLD):
119 endpt.trace("Success, PESQ result=" + pesq_res)
120 else:
121 endpt.trace("Failed, PESQ result=" + pesq_res)
122 raise TestError("WAV seems to be degraded badly")
123
124
125# Here where it all comes together
126test = cfg_file.test_param
127test.test_func = test_func
128test.post_func = post_func
129test.user_data = mod_pesq_user_data()
130