Skip to content
Snippets Groups Projects
  1. Aug 02, 2011
  2. Jul 31, 2011
  3. Jul 29, 2011
  4. Feb 10, 2011
  5. Feb 06, 2011
    • Timothy B. Terriberry's avatar
      16-bit int fixes. · 285bc372
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      This fixes a number of issues for platforms with a 16-bit int, but
       by no means all of them.
      The type change for ec_window (for platforms where sizeof(size_t)==2)
       will break ABI (but not API) compatibility with libsilk and libopus,
       and reduce speed on x86-64, but allows the code to work in real-mode
       DOS without using the huge memory model, which is useful for testing
       16-bit int compliance.
      285bc372
  6. Feb 04, 2011
    • Timothy B. Terriberry's avatar
      Refactor the entropy coder. · a093f4df
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      This unifies the byte buffer, encoder, and decoder into a single
       struct.
      The common encoder and decoder functions (such as ec_tell()) can
       operate on either one, simplifying code which uses both.
      The precision argument to ec_tell() has been removed.
      It now comes in two precisions:
        ec_tell() gives 1 bit precision in two operations, and
        ec_tell_frac() gives 1/8th bit precision in... somewhat more.
      ec_{enc|dec}_bit_prob() were removed (they are no longer needed).
      Some of the byte buffer access functions were made static and
       removed from the cross-module API.
      All of the code in rangeenc.c and rangedec.c was merged into
       entenc.c and entdec.c, respectively, as we are no longer
       considering alternative backends.
      rangeenc.c and rangede.c have been removed entirely.
      
      This passes make check, after disabling the modes that we removed
       support for in cf5d3a8c.
      a093f4df
  7. Feb 01, 2011
    • Timothy B. Terriberry's avatar
      Add a seprate qtheta offset for two-phase stereo. · 411a84fa
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      9b34bd83 caused serious regressions for 240-sample frame stereo,
       because the previous qb limit was _always_ hit for two-phase
       stereo.
      Two-phase stereo really does operate with a different model (for
       example, the single bit allocated to the side should really
       probably be thought of as a sign bit for qtheta, but we don't
       count it as part of qtheta's allocation).
      The old code was equivalent to a separate two-phase offset of 12,
       however Greg Maxwell's testing demonstrates that 16 performs
       best.
      411a84fa
  8. Jan 31, 2011
  9. Jan 30, 2011
    • Timothy B. Terriberry's avatar
      Use a smarter per-band bitrate cap. · c5643074
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      The previous "dumb cap" of (64<<LM)*(C<<BITRES) was not actually
       achievable by many (most) bands, and did not take the cost of
       coding theta for splits into account, and so was too small for some
       bands.
      This patch adds code to compute a fairly accurate estimate of the
       real maximum per-band rate (an estimate only because of rounding
       effects and the fact that the bit usage for theta is variable),
       which is then truncated and stored in an 8-bit table in the mode.
      
      This gives improved quality at all rates over 160 kbps/channel,
       prevents bits from being wasted all the way up to 255 kbps/channel
       (the maximum rate allowed, and approximately the maximum number of
       bits that can usefully be used regardless of the allocation), and
       prevents dynalloc and trim from producing enormous waste
       (eliminating the need for encoder logic to prevent this).
      c5643074
  10. Jan 10, 2011
  11. Jan 09, 2011
    • Timothy B. Terriberry's avatar
      Prevent busts at low bitrates. · 76469c64
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      This patch makes all symbols conditional on whether or not there's
       enough space left in the buffer to code them, and eliminates much
       of the redundancy in the side information.
      
      A summary of the major changes:
      * The isTransient flag is moved up to before the the coarse energy.
        If there are not enough bits to code the coarse energy, the flag
         would get forced to 0, meaning what energy values were coded
         would get interpreted incorrectly.
        This might not be the end of the world, and I'd be willing to
         move it back given a compelling argument.
      * Coarse energy switches coding schemes when there are less than 15
         bits left in the packet:
        - With at least 2 bits remaining, the change in energy is forced
           to the range [-1...1] and coded with 1 bit (for 0) or 2 bits
           (for +/-1).
        - With only 1 bit remaining, the change in energy is forced to
           the range [-1...0] and coded with one bit.
        - If there is less than 1 bit remaining, the change in energy is
           forced to -1.
          This effectively low-passes bands whose energy is consistently
           starved; this might be undesirable, but letting the default be
           zero is unstable, which is worse.
      * The tf_select flag gets moved back after the per-band tf_res
         flags again, and is now skipped entirely when none of the
         tf_res flags are set, and the default value is the same for
         either alternative.
      * dynalloc boosting is now limited so that it stops once it's given
         a band all the remaining bits in the frame, or when it hits the
         "stupid cap" of (64<<LM)*(C<<BITRES) used during allocation.
      * If dynalloc boosing has allocated all the remaining bits in the
         frame, the alloc trim parameter does not get encoded (it would
         have no effect).
      * The intensity stereo offset is now limited to the range
         [start...codedBands], and thus doesn't get coded until after
         all of the skip decisions.
        Some space is reserved for it up front, and gradually given back
         as each band is skipped.
      * The dual stereo flag is coded only if intensity>start, since
         otherwise it has no effect.
        It is now coded after the intensity flag.
      * The space reserved for the final skip flag, the intensity stereo
         offset, and the dual stereo flag is now redistributed to all
         bands equally if it is unused.
        Before, the skip flag's bit was given to the band that stopped
         skipping without it (usually a dynalloc boosted band).
      
      In order to enable simple interaction between VBR and these
       packet-size enforced limits, many of which are encountered before
       VBR is run, the maximum packet size VBR will allow is computed at
       the beginning of the encoding function, and the buffer reduced to
       that size immediately.
      Later, when it is time to make the VBR decision, the minimum packet
       size is set high enough to ensure that no decision made thus far
       will have been affected by the packet size.
      As long as this is smaller than the up-front maximum, all of the
       encoder's decisions will remain in-sync with the decoder.
      If it is larger than the up-front maximum, the packet size is kept
       at that maximum, also ensuring sync.
      The minimum used now is slightly larger than it used to be, because
       it also includes the bits added for dynalloc boosting.
      Such boosting is shut off by the encoder at low rates, and so
       should not cause any serious issues at the rates where we would
       actually run out of room before compute_allocation().
      76469c64
  12. Jan 08, 2011
    • Timothy B. Terriberry's avatar
      Fix rounding in bits2pulses search. · 1cb32aa0
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      The mid = (lo+hi)>>1 line in the binary search would allow hi to drop
       down to the same value as lo, meaning the rounding after the search
       would be choosing between the same two values.
      This patch changes it to (lo+hi+1)>>1.
      This will allow lo to increase up to the value hi, but only in the
       case that we can't possibly allocate enough pulses to meet the
       target number of bits (in which case the rounding doesn't matter).
      To pay for the extra add, this moves the +1 in the comparison to bits
       to the other side, which can then be taken outside the loop.
      The compiler can't normally do this because it might cause overflow
       which would change the results.
      
      This rarely mattered, but gives a 0.01 PEAQ improvement on 12-byte
       120 sample frames.
      It also makes the search process describable with a simple
       algorithm, rather than relying on this particular optimized
       implementation.
      I.e., the binary search loop can now be replaced with
        for(lo=0;lo+1<cache[0]&&cache[lo+1]<bits;lo++);
        hi=lo+1;
       and it will give equivalent results.
      This was not true before.
      1cb32aa0
  13. Dec 16, 2010
  14. Dec 15, 2010
  15. Dec 10, 2010
  16. Oct 18, 2010
  17. Sep 30, 2010
  18. Sep 28, 2010
  19. Aug 31, 2010
  20. Aug 25, 2010
  21. Aug 06, 2010
  22. Aug 05, 2010
  23. Jul 29, 2010
  24. Jul 27, 2010
    • Jean-Marc Valin's avatar
      Bit allocation · 37546cc3
      Jean-Marc Valin authored
      Also convert the stereo split code to use log(N)/2 as the bit allocation
      offset
      37546cc3
    • Timothy B. Terriberry's avatar
      Adjust fine bits allocation. · a345decd
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      The old code allocated too many fine bits to large bands.
      New allocations were derived from by numerical optimization using quantization
       MSE sampled from Laplacian distributed random data to within +/- 1 bit for
       N=2...160 and bits per band from 0 to 64.
      Those allocations could be modeled with only minor errors using a simple offset
       of 19/8+log2(N), with no bits spent on fine energy when there would not be
       enough bits remaining to code a single pulse.
      However, PEAQ testing suggested an offset of 14/8 was better, and that it was
       always worth spending at least one bit on fine energy.
      a345decd
  25. Jul 23, 2010
  26. Jul 13, 2010
  27. Jun 03, 2010
  28. May 24, 2010
  29. May 21, 2010
  30. May 14, 2010
  31. Apr 26, 2010
  32. Feb 26, 2010
  33. Oct 18, 2009
  34. Oct 17, 2009
Loading