- Fixed bug of calculating clock interval which should include channel count
 - Added L16 codecs including stereo
 - Added WAV files for stereo tests



git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@2075 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
Nanang Izzuddin 2008-06-27 16:18:13 +00:00
parent 81e9bd52cd
commit 9869cb5cbb
14 changed files with 189 additions and 20 deletions

View File

@ -121,9 +121,10 @@ typedef void pjmedia_clock_callback(const pj_timestamp *ts,
*
* @param pool Pool to allocate memory.
* @param clock_rate Number of samples per second.
* @param channel_count Number of channel.
* @param samples_per_frame Number of samples per frame. This argument
* along with clock_rate, specifies the interval
* of each clock run (or clock ticks).
* along with clock_rate and channel_count, specifies
* the interval of each clock run (or clock ticks).
* @param options Bitmask of pjmedia_clock_options.
* @param cb Callback to be called for each clock tick.
* @param user_data User data, which will be passed to the callback.
@ -134,6 +135,7 @@ typedef void pjmedia_clock_callback(const pj_timestamp *ts,
*/
PJ_DECL(pj_status_t) pjmedia_clock_create( pj_pool_t *pool,
unsigned clock_rate,
unsigned channel_count,
unsigned samples_per_frame,
unsigned options,
pjmedia_clock_callback *cb,

View File

@ -55,6 +55,7 @@ static int clock_thread(void *arg);
*/
PJ_DEF(pj_status_t) pjmedia_clock_create( pj_pool_t *pool,
unsigned clock_rate,
unsigned channel_count,
unsigned samples_per_frame,
unsigned options,
pjmedia_clock_callback *cb,
@ -74,7 +75,8 @@ PJ_DEF(pj_status_t) pjmedia_clock_create( pj_pool_t *pool,
if (status != PJ_SUCCESS)
return status;
clock->interval.u64 = samples_per_frame * clock->freq.u64 / clock_rate;
clock->interval.u64 = samples_per_frame * clock->freq.u64 /
channel_count / clock_rate;
clock->next_tick.u64 = 0;
clock->timestamp.u64 = 0;
clock->max_jump = MAX_JUMP_MSEC * clock->freq.u64 / 1000;

View File

@ -52,6 +52,7 @@ PJ_DEF(pj_status_t) pjmedia_master_port_create( pj_pool_t *pool,
{
pjmedia_master_port *m;
unsigned clock_rate;
unsigned channel_count;
unsigned samples_per_frame;
unsigned bytes_per_frame;
pj_status_t status;
@ -64,15 +65,20 @@ PJ_DEF(pj_status_t) pjmedia_master_port_create( pj_pool_t *pool,
PJ_ASSERT_RETURN(u_port->info.clock_rate == d_port->info.clock_rate,
PJMEDIA_ENCCLOCKRATE);
/* Both ports MUST have equal ptime */
PJ_ASSERT_RETURN(u_port->info.clock_rate/u_port->info.samples_per_frame==
d_port->info.clock_rate/d_port->info.samples_per_frame,
/* Both ports MUST have equal samples per frame */
PJ_ASSERT_RETURN(u_port->info.samples_per_frame==
d_port->info.samples_per_frame,
PJMEDIA_ENCSAMPLESPFRAME);
/* Both ports MUST have equal channel count */
PJ_ASSERT_RETURN(u_port->info.channel_count == d_port->info.channel_count,
PJMEDIA_ENCCHANNEL);
/* Get clock_rate and samples_per_frame from one of the port. */
clock_rate = u_port->info.clock_rate;
samples_per_frame = u_port->info.samples_per_frame;
channel_count = u_port->info.channel_count;
/* Get the bytes_per_frame value, to determine the size of the
@ -102,8 +108,9 @@ PJ_DEF(pj_status_t) pjmedia_master_port_create( pj_pool_t *pool,
return status;
/* Create media clock */
status = pjmedia_clock_create(pool, clock_rate, samples_per_frame,
options, &clock_callback, m, &m->clock);
status = pjmedia_clock_create(pool, clock_rate, channel_count,
samples_per_frame, options, &clock_callback,
m, &m->clock);
if (status != PJ_SUCCESS) {
pj_lock_destroy(m->lock);
return status;

View File

@ -49,12 +49,35 @@ def test_func(t, user_data):
# Get output file name
user_data.output_filename = re.compile(const.MEDIA_REC_FILE).search(ua2.inst_param.arg).group(1)
# Find appropriate clock rate for the input file
# Get WAV input length, in seconds
fin = wave.open(user_data.input_filename, "r")
if fin == None:
raise TestError("Failed opening input WAV file")
inwavlen = fin.getnframes() * 1.0 / fin.getframerate()
inwavlen += 0.2
fin.close()
print "WAV input len = " + str(inwavlen) + "s"
# Get clock rate of the output
mo_clock_rate = re.compile("\.(\d+)\.wav").search(user_data.output_filename)
if (mo_clock_rate==None):
raise TestError("Cannot compare input & output, incorrect output filename format")
clock_rate = mo_clock_rate.group(1)
user_data.input_filename = re.sub("\.\d+\.wav", "."+clock_rate+".wav", user_data.input_filename)
# Get channel count of the output
channel_count = 1
if re.search("--stereo", ua2.inst_param.arg) != None:
channel_count = 2
# Get matched input file from output file
# (PESQ evaluates only files whose same clock rate & channel count)
if channel_count == 2:
if re.search("\.\d+\.\d+\.wav", user_data.input_filename) != None:
user_data.input_filename = re.sub("\.\d+\.\d+\.wav",
"." + str(channel_count) + "."+clock_rate+".wav", user_data.input_filename)
else:
user_data.input_filename = re.sub("\.\d+\.wav",
"." + str(channel_count) + "."+clock_rate+".wav", user_data.input_filename)
if (clock_rate != "8") & (clock_rate != "16"):
raise TestError("PESQ only works on clock rate 8kHz or 16kHz, clock rate used = "+clock_rate+ "kHz")
@ -62,15 +85,6 @@ def test_func(t, user_data):
# Get conference clock rate of UA2 for PESQ sample rate option
user_data.pesq_sample_rate_opt = "+" + clock_rate + "000"
# Get WAV input length, in seconds
fin = wave.open(user_data.input_filename, "r")
if fin == None:
raise TestError("Failed opening input WAV file")
inwavlen = fin.getnframes() // fin.getframerate()
if (fin.getnframes() % fin.getframerate()) > 0:
inwavlen = inwavlen + 1
fin.close()
# UA1 making call
ua1.send("m")
ua1.send(t.inst_params[1].uri)
@ -109,7 +123,7 @@ def post_func(t, user_data):
pesq_out = pesq_proc.communicate()
# Parse ouput
mo_pesq_out = re.compile("Prediction[^=]+=\s+([\d\.]+)\s*").search(pesq_out[0])
mo_pesq_out = re.compile("Prediction[^=]+=\s+([\-\d\.]+)\s*").search(pesq_out[0])
if (mo_pesq_out == None):
raise TestError("Failed to fetch PESQ result")

View File

@ -0,0 +1,19 @@
# $Id$
#
from inc_cfg import *
ADD_PARAM = ""
if (HAS_SND_DEV == 0):
ADD_PARAM += "--null-audio"
# Call with L16/16000/1 codec
test_param = TestParam(
"PESQ codec L16/16000/1",
[
InstanceParam("UA1", ADD_PARAM + " --max-calls=1 --add-codec L16/16000/1 --clock-rate 16000 --play-file wavs/input.16.wav"),
InstanceParam("UA2", "--null-audio --max-calls=1 --add-codec L16/16000/1 --clock-rate 16000 --rec-file wavs/tmp.16.wav --auto-answer 200")
]
)
pesq_threshold = 3.5

View File

@ -0,0 +1,19 @@
# $Id$
#
from inc_cfg import *
ADD_PARAM = ""
if (HAS_SND_DEV == 0):
ADD_PARAM += "--null-audio"
# Call with L16/16000/2 codec
test_param = TestParam(
"PESQ defaults pjsua settings",
[
InstanceParam("UA1", ADD_PARAM + " --stereo --max-calls=1 --clock-rate 16000 --add-codec L16/16000/2 --play-file wavs/input.2.16.wav"),
InstanceParam("UA2", "--null-audio --stereo --max-calls=1 --clock-rate 16000 --add-codec L16/16000/2 --rec-file wavs/tmp.2.16.wav --auto-answer 200")
]
)
pesq_threshold = None

View File

@ -0,0 +1,19 @@
# $Id$
#
from inc_cfg import *
ADD_PARAM = ""
if (HAS_SND_DEV == 0):
ADD_PARAM += "--null-audio"
# Call with L16/8000/1 codec
test_param = TestParam(
"PESQ codec L16/8000/1",
[
InstanceParam("UA1", ADD_PARAM + " --max-calls=1 --add-codec L16/8000/1 --clock-rate 8000 --play-file wavs/input.8.wav"),
InstanceParam("UA2", "--null-audio --max-calls=1 --add-codec L16/8000/1 --clock-rate 8000 --rec-file wavs/tmp.8.wav --auto-answer 200")
]
)
pesq_threshold = 3.5

View File

@ -0,0 +1,19 @@
# $Id$
#
from inc_cfg import *
ADD_PARAM = ""
if (HAS_SND_DEV == 0):
ADD_PARAM += "--null-audio"
# Call with L16/8000/2 codec
test_param = TestParam(
"PESQ defaults pjsua settings",
[
InstanceParam("UA1", ADD_PARAM + " --stereo --max-calls=1 --clock-rate 8000 --add-codec L16/8000/2 --play-file wavs/input.2.8.wav"),
InstanceParam("UA2", "--null-audio --stereo --max-calls=1 --clock-rate 8000 --add-codec L16/8000/2 --rec-file wavs/tmp.2.8.wav --auto-answer 200")
]
)
pesq_threshold = None

View File

@ -0,0 +1,17 @@
# $Id$
#
from inc_cfg import *
# Call with L16/16000/1 codec
test_param = TestParam(
"PESQ codec L16/16000/1 (RX side uses snd dev)",
[
InstanceParam("UA1", "--max-calls=1 --add-codec L16/16000/1 --clock-rate 16000 --play-file wavs/input.16.wav --null-audio"),
InstanceParam("UA2", "--max-calls=1 --add-codec L16/16000/1 --clock-rate 16000 --rec-file wavs/tmp.16.wav --auto-answer 200")
]
)
if (HAS_SND_DEV == 0):
test_param.skip = True
pesq_threshold = 3.5

View File

@ -0,0 +1,17 @@
# $Id$
#
from inc_cfg import *
# Call with L16/16000/2 codec
test_param = TestParam(
"PESQ defaults pjsua settings",
[
InstanceParam("UA1", "--stereo --max-calls=1 --clock-rate 16000 --add-codec L16/16000/2 --play-file wavs/input.2.16.wav --null-audio"),
InstanceParam("UA2", "--stereo --max-calls=1 --clock-rate 16000 --add-codec L16/16000/2 --rec-file wavs/tmp.2.16.wav --auto-answer 200")
]
)
if (HAS_SND_DEV == 0):
test_param.skip = True
pesq_threshold = None

View File

@ -0,0 +1,17 @@
# $Id$
#
from inc_cfg import *
# Call with L16/8000/1 codec
test_param = TestParam(
"PESQ codec L16/8000/1 (RX side uses snd dev)",
[
InstanceParam("UA1", "--max-calls=1 --add-codec L16/8000/1 --clock-rate 8000 --play-file wavs/input.8.wav --null-audio"),
InstanceParam("UA2", "--max-calls=1 --add-codec L16/8000/1 --clock-rate 8000 --rec-file wavs/tmp.8.wav --auto-answer 200")
]
)
if (HAS_SND_DEV == 0):
test_param.skip = True
pesq_threshold = 3.5

View File

@ -0,0 +1,17 @@
# $Id$
#
from inc_cfg import *
# Call with L16/8000/2 codec
test_param = TestParam(
"PESQ defaults pjsua settings",
[
InstanceParam("UA1", "--stereo --max-calls=1 --clock-rate 8000 --add-codec L16/8000/2 --play-file wavs/input.2.8.wav --null-audio"),
InstanceParam("UA2", "--stereo --max-calls=1 --clock-rate 8000 --add-codec L16/8000/2 --rec-file wavs/tmp.2.8.wav --auto-answer 200")
]
)
if (HAS_SND_DEV == 0):
test_param.skip = True
pesq_threshold = None

Binary file not shown.

Binary file not shown.