This is a small patch, but it does have a big impact on bit allocation. Measured with the attached scripts (in case someone might find them useful), all the regressions marked in the report have no audible difference (I didn't check them all though), but the improvements can be heard.
This affects mostly high bit rates. It's related to issue #2686. In the report, A is the patched version, B is unpatched, all comparisons show deltas in the form (A-B), so a positive pSNR delta means a better quality in the patched version, and negative a regression. Regressions are only considered for pSNR deltas below -1db, they're considered serious below -6db. All measurements were done with tiny_psnr. The summary of the report inline for quick reading: Files: 58 Bitrates: 6 Tests: 347 Serious Regressions: 0 (0%) Regressions: 10 (2%) Improvements: 54 (15%) Big improvements: 26 (7%) Worst regression - sine_tester.flac - 384k - StdDev: 1.68 pSNR: -3.05 maxdiff: -178.00 Best improvement - 07 - Bound.flac - 384k - StdDev: -1700.05 pSNR: 20.64 maxdiff: -29595.00 Average - StdDev: -55.67 pSNR: 1.20 maxdiff: -1593.00
From f9159b5514a80f4e19c8b6da108ac9f87272a871 Mon Sep 17 00:00:00 2001 From: Claudio Freire <[email protected]> Date: Sun, 1 Mar 2015 20:11:12 -0300 Subject: [PATCH] Fix AAC Psy PE reduction calculation when multiple iterations are required AB testing results: http://pastebin.com/051BXYTy --- libavcodec/aacpsy.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/aacpsy.c b/libavcodec/aacpsy.c index 068fbcd..d1e65f6 100644 --- a/libavcodec/aacpsy.c +++ b/libavcodec/aacpsy.c @@ -717,7 +717,7 @@ static void psy_3gpp_analyze_channel(FFPsyContext *ctx, int channel, } desired_pe_no_ah = FFMAX(desired_pe - (pe - pe_no_ah), 0.0f); if (active_lines > 0.0f) - reduction += calc_reduction_3gpp(a, desired_pe_no_ah, pe_no_ah, active_lines); + reduction = calc_reduction_3gpp(a, desired_pe_no_ah, pe_no_ah, active_lines); pe = 0.0f; for (w = 0; w < wi->num_windows*16; w += 16) { -- 1.8.4.5
abtest.sh
Description: Bourne shell script
#!/usr/bin/python
import sys
import re
import collections
import functools
if len(sys.argv) < 3:
print "Usage: abreport <patched-set-name> <reference-set-name>"
sys.exit()
testre = re.compile(r"^-+ +(?P<bps>[0-9a-zA-Z]*) +- +(?P<name>.*) +-+$")
statre = re.compile(r"^ *(?P<name>[a-zA-Z]+) *: *stddev *: *(?P<stddev>[0-9.]+) *PSNR *: *(?P<psnr>[0-9.]+) *MAXDIFF *: *(?P<maxdiff>[0-9]+) *bytes: *[0-9]+ */ *[0-9]+ *$")
A = sys.argv[1]
B = sys.argv[2]
stats = collections.defaultdict(functools.partial(collections.defaultdict, dict))
allbps = set()
curname = None
curbps = None
for l in sys.stdin:
m = testre.match(l)
if m:
curname = m.group('name')
curbps = m.group('bps')
m = statre.match(l)
if m:
curset = m.group('name')
stddev = float(m.group('stddev'))
psnr = float(m.group('psnr'))
maxdiff = int(m.group('maxdiff'))
stats[curname][curbps][curset] = (stddev,psnr,maxdiff)
allbps.add(curbps)
regressions = []
big_regressions = []
improvements = []
big_improvements = []
deltas = []
worstname = worstbps = worstdelta = None
bestname = bestbps = bestdelta = None
avgdelta = [0,0,0]
for name, bstats in stats.iteritems():
for bps, sets in bstats.iteritems():
astddev, apsnr, amaxdiff = stats[name][bps][A]
bstddev, bpsnr, bmaxdiff = stats[name][bps][B]
dpsnr = apsnr - bpsnr
dstddev = astddev - bstddev
dmaxdiff = amaxdiff - bmaxdiff
delta = (dstddev,dpsnr,dmaxdiff)
deltas.append(delta)
avgdelta[0] += delta[0]
avgdelta[1] += delta[1]
avgdelta[2] += delta[2]
if worstdelta is None or worstdelta[1] > delta[1]:
worstname, worstbps, worstdelta = name, bps, delta
if bestdelta is None or bestdelta[1] < delta[1]:
bestname, bestbps, bestdelta = name, bps, delta
if dpsnr < -1:
regressions.append((name, bps))
if dpsnr < -6:
big_regressions.append((name, bps))
elif dpsnr > 1:
improvements.append((name, bps))
if dpsnr > 6:
big_improvements.append((name, bps))
avgdelta = (avgdelta[0]/len(deltas), avgdelta[1]/len(deltas), avgdelta[2]/len(deltas))
ntests = 0
for name in stats:
ntests += len(stats[name])
print "Summary:\n"
print "Files:", len(stats)
print "Bitrates:", len(allbps)
print "Tests:", ntests
print "Serious Regressions:", len(big_regressions), "(%d%%)" % (len(big_regressions) * 100 / ntests,)
for rname,rbps in big_regressions:
print " - %s - %s" % (rbps, rname)
print "Regressions:", len(regressions), "(%d%%)" % (len(regressions) * 100 / ntests,)
for rname,rbps in regressions:
print " - %s - %s" % (rbps, rname)
print "Improvements:", len(improvements), "(%d%%)" % (len(improvements) * 100 / ntests,)
for rname,rbps in improvements:
print " - %s - %s" % (rbps, rname)
print "Big improvements:", len(big_improvements), "(%d%%)" % (len(big_improvements) * 100 / ntests,)
for rname,rbps in big_improvements:
print " - %s - %s" % (rbps, rname)
print "Worst regression - %s - %s" % (worstname, worstbps)
print " - StdDev: %.2f \tpSNR: %.2f \tmaxdiff: %.2f" % worstdelta
print "Best improvement - %s - %s" % (bestname, bestbps)
print " - StdDev: %.2f \tpSNR: %.2f \tmaxdiff: %.2f" % bestdelta
print "Average - StdDev: %.2f \tpSNR: %.2f \tmaxdiff: %.2f" % avgdelta
print "\nDetails:\n"
for name in sorted(stats):
print "--", name
for bps in sorted(stats[name], key=lambda x:int(x.strip('kb'))):
astddev, apsnr, amaxdiff = stats[name][bps][A]
bstddev, bpsnr, bmaxdiff = stats[name][bps][B]
print " %s \t- StdDev: %.2f \tpSNR: %.2f \tmaxdiff: %.2f" % (bps, astddev-bstddev, apsnr-bpsnr, amaxdiff-bmaxdiff)
aac-bugfixes-1.abtest
Description: Binary data
aac-bugfixes-1.abreport
Description: Binary data
_______________________________________________ ffmpeg-devel mailing list [email protected] http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
