| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- #!/usr/bin/env python
- from string import *
- import commands
- import getopt
- import os
- import 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 find(out, "No") == -1:
- 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 status != 1:
- Usage(options_file + " not readable")
- # check readability of input_file
- status = os.access(input_file, os.R_OK)
- if status != 1:
- 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 status == 1:
- lame1_ok = 1
- break
- if lame1_ok != 1:
- 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 status == 1:
- lame2_ok = 1
- break
- if lame2_ok != 1:
- 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
|