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 <claudiofreire@klaumptop.jampp.local>
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

Attachment: 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)

Attachment: aac-bugfixes-1.abtest
Description: Binary data

Attachment: aac-bugfixes-1.abreport
Description: Binary data

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to