blob: 11152e719d37d4d1d820c0962f88f538269dd0dd [file] [log] [blame]
#!/usr/bin/env python
from string import *
import os, commands, getopt, sys
def Usage(mesg):
print mesg + os.linesep
print "Usage: " + os.linesep
print "Mode 1. Compare output of 'lame1' and 'lame2':"
print "./lametest.py [options] options_file input.wav lame1 lame2" + os.linesep
print "Mode 2. Compare output of lame1 with reference solutions:"
print "./lametest.py [options] options_file input.wav lame1" + os.linesep
print "Mode 3. Generate reference solutions using lame1:"
print "./lametest.py -m options_file input.wav lame1" + os.linesep
print "options: "
print " -w convert mp3's to wav's before comparison"
sys.exit(0)
##################################################################
# compare two files, return # bytes which differ and the
# number of bytes in larger file
##################################################################
def fdiff(name1,name2):
cmd = "cmp -l "+name1 + " " + name2 + " | wc -l"
# XXX either
# use a combination of os.popen + read
# or
# write owen cmp+wc function
# to replace commands.getoutput
out = commands.getoutput(cmd)
out = split(out,"\n")
out=out[-1]
if (-1==find(out,"No")):
diff = atof(out)
status = os.access(name1, os.R_OK)
if 1 != status:
size1=0
else:
size1 = os.path.getsize(name1)
size2 = os.path.getsize(name2)
diff = diff + abs(size1-size2)
size = max(size1,size2)
else:
diff = -1
size = 0
return (diff,size)
##################################################################
# compare two files, return # bytes which differ and the
# number of bytes in larger file
##################################################################
def compare(name1,name2,decode):
if (decode):
print "converting mp3 to wav for comparison..."
# XXX shouldn't we use lame1 instead of a hardcoded lame?
os.system("lame --quiet --mp3input --decode " + name1)
os.system("lame --quiet --mp3input --decode " + name2)
name1 = name1 + ".wav"
name2 = name2 + ".wav"
rcode = 0
diff,size=fdiff(name1,name2)
if (diff==0):
print "output identical: diff=%i total=%i" % (diff,size)
rcode = 1
elif (diff>0):
print "output different: diff=%i total=%i %2.0f%%" % \
(diff,size,100*float(diff)/size)
else:
print "Error comparing files:"
print "File 1: " + name1
print "File 2: " + name2
return rcode
##################################################################
# main program
##################################################################
try:
optlist, args = getopt.getopt(sys.argv[1:], 'wm')
except getopt.error, val:
Usage('ERROR: ' + val)
decode=0
lame2="none"
for opt in optlist:
if opt[0] == '-w':
decode=1
elif opt[0] == '-m':
lame2="makeref"
print os.linesep + "Generating reference output"
if len(args) < 3:
Usage("Not enough arguments.")
if len(args) > 4:
Usage("Too many arguments.")
if (lame2=="makeref"):
if len(args) != 3:
Usage("Too many arguments for -r/-m mode.")
else:
if len(args) ==3:
lame2="ref"
# populate variables from args and normalize & expand path
if len(args) >=3:
options_file = os.path.normpath(os.path.expanduser(args[0]))
input_file = os.path.normpath(os.path.expanduser(args[1]))
lame1 = os.path.normpath(os.path.expanduser(args[2]))
if len(args) >=4:
lame2 = os.path.normpath(os.path.expanduser(args[3]))
# check readability of options_file
status = os.access(options_file, os.R_OK)
if 1 != status:
Usage(options_file + " not readable")
# check readability of input_file
status = os.access(input_file, os.R_OK)
if 1 != status:
Usage(input_file + " not readable")
# generate searchlist of directories
path = split(os.environ['PATH'], os.pathsep)
path.append(os.curdir)
# init indicator vars
lame1_ok = 0
lame2_ok = 0
# check for executable lame1
for x in path:
status = os.access(os.path.join(x, lame1), os.X_OK)
if 1 == status:
lame1_ok = 1
break
if 1 != lame1_ok:
Usage(lame1 + " is not executable")
if not (lame2=="ref" or lame2=="makeref"):
# check for executable lame2
for x in path:
status = os.access(os.path.join(x, lame2), os.X_OK)
if 1 == status:
lame2_ok = 1
break
if 1 != lame2_ok:
Usage(lame2 + " is not executable")
tmp = split(options_file, os.sep)
tmp = tmp[-1]
basename = replace(input_file,".wav","")
basename = basename + "." + tmp
num_ok=0
n=0
foptions=open(options_file)
line = rstrip(foptions.readline())
while line:
n = n+1
name1 = basename + "." + str(n) + ".mp3"
name2 = basename + "." + str(n) + "ref.mp3"
print # empty line
if (lame2=='ref'):
cmd = "rm -f "+name1
os.system(cmd)
cmd = lame1 + " --quiet " + line + " " + input_file + " " + name1
print "executable: ",lame1
print "options: ",line
print "input: ",input_file
print "reference output:",name2
print cmd
os.system(cmd)
num_ok = num_ok+compare(name1,name2,decode)
elif (lame2=='makeref'):
cmd = "rm -f "+name2
os.system(cmd)
print "executable: ",lame1
print "options: ",line
print "input: ",input_file
print "output: ",name2
cmd = lame1 + " --quiet " + line + " " + input_file + " " + name2
os.system(cmd)
else:
cmd = "rm -f "+name1
os.system(cmd)
cmd = "rm -f "+name2
os.system(cmd)
print "executable: ",lame1
print "executable2: ",lame2
print "options: ",line
print "input: ",input_file
cmd1 = lame1 + " --quiet " + line + " " + input_file + " " + name1
cmd2 = lame2 + " --quiet " + line + " " + input_file + " " + name2
os.system(cmd1)
os.system(cmd2)
num_ok = num_ok + compare(name1,name2,decode)
line = rstrip(foptions.readline())
foptions.close()
if lame2 != 'makeref':
print os.linesep + "Number of tests which passed: ",num_ok
print "Number of tests which failed: ",n-num_ok