Skip to content
  • Timothy B. Terriberry's avatar
    Make collapse-detection bitexact. · 21af73eb
    Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
    Jean-Marc's original anti-collapse patch used a threshold on the
     content of a decoded band to determine whether or not it should
     be filled with random noise.
    Since this is highly sensitive to the accuracy of the
     implementation, it could lead to significant decoder output
     differences even if decoding error up to that point was relatively
     small.
    
    This patch detects collapsed bands from the output of the vector
     quantizer, using exact integer arithmetic.
    It makes two simplifying assumptions:
     a) If either input to haar1() is non-zero during TF resolution
         adjustments, then the output will be non-zero.
     b) If the content of a block is non-zero in any of the bands that
         are used for folding, then the folded output will be non-zero.
    b) in particular is likely to be false when SPREAD_NONE is used.
    It also ignores the case where mid and side are orthogonal in
     stereo_merge, but this is relatively unlikely.
    This misses just over 3% of the cases that Jean-Marc's anti-collapse
     detection strategy would catch, but does not mis-classify any (all
     detected collapses are true collapses).
    
    This patch overloads the "fill" parameter to mark which blocks have
     non-zero content for folding.
    As a consequence, if a set of blocks on one side of a split has
     collapsed, _no_ folding is done: the result would be zero anyway,
     except for short blocks with SPREAD_AGGRESSIVE that are split down
     to a single block, but a) that means a lot of bits were available
     so a collapse is unlikely and b) anti-collapse can fill the block
     anyway, if it's used.
    This also means that if itheta==0 or itheta==16384, we no longer
     fold at all on that side (even with long blocks), since we'd be
     multiplying the result by zero anyway.
    21af73eb