Skip to content
Snippets Groups Projects
  1. Mar 03, 2011
    • Timothy B. Terriberry's avatar
      Eliminate the ec_int32 and ec_uint32 typedefs. · 9bac8c17
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      These were used because the entropy coder originally came from
       outside libcelt, and thus did not have a common type system.
      It's now undergone enough modification that it's not ever likely to
       be used as-is in another codec without some porting effort, so
       there's no real reason to maintain the typedefs separately.
      Hopefully we'll replace these all again somedate with a common set
       of Opus typedefs, but for now this will do.
      
      This fixes an issue caused by commit 6c8acbf1, which moved the
       ec_ilog() prototype from entcode.h to ecintrin.h, where the
       ec_uint32 typedef was not yet available.
      Thanks to John Ridges for the report.
      9bac8c17
  2. Feb 10, 2011
  3. 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
  4. Jan 08, 2011
    • Timothy B. Terriberry's avatar
      Changes to ec_dec_cdf() to support 8-bit tables. · 845dfa19
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      This renames ec_dec_cdf() to ec_dec_icdf(), and changes the
       functionality to use an "inverse" CDF table, where
       icdf[i]=ft-cdf[i+1].
      The first entry is omitted entirely.
      It also adds a corresonding ec_enc_icdf() to the encoder, which uses
       the same table.
      One could use ec_encode_bin() by converting the values in the tables
       back to normal CDF values, but the icdf[] table already has them in
       the form ec_encode_bin() wants to use them, so there's no reason to
       translate them and then translate them back.
      
      This is done primarily to allow SILK to use the range coder with
       8-bit probability tables containing cumulative frequencies that
       span the full range 0...256.
      With an 8-bit table, the final 256 of a normal CDF becomes 0 in the
       "inverse" CDF.
      It's the 0 at the start of a normal CDF which would become 256, but
       this is the value we omit, as it already has to be special-cased in
       the encoder, and is not used at all in the decoder.
      845dfa19
  5. Dec 22, 2010
    • Timothy B. Terriberry's avatar
      Update ec_dec_cdf() to use an unsigned cdf[]. · 1aaa50d1
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      For our current usage, this doesn't matter, but is more consistent
       with the rest of the API.
      We may want to reduce this to an unsigned char[], but I'd rather
       coordinate that optimization with SILK's planned reduction to
       8-bit CDFs, as we may be able to use the same code.
      1aaa50d1
  6. Dec 21, 2010
    • Timothy B. Terriberry's avatar
      Entropy coder clean-up. · 30df6cf3
      Timothy B. Terriberry authored
      This simplifies a good bit of the error handling, and should make it
       impossible to overrun the buffer in the encoder or decoder, while
       still allowing tell() to operate correctly after a bust.
      The encoder now tries to keep the range coder data intact after a
       bust instead of corrupting it with extra bits data, though this is
       not a guarantee (too many extra bits may have already been flushed).
      It also now correctly reports errors when the bust occurs merging the
       last byte of range coder and extra bits.
      
      A number of abstraction barrier violations were cleaned up, as well.
      This patch also includes a number of minor performance improvements:
       ec_{enc|dec}_bits() in particular should be much faster.
      
      Finally, tf_select was changed to be coded with the range coder
       rather than extra bits, so that it is at the front of the packet
       (for unequal error protection robustness).
      30df6cf3
  7. Dec 18, 2010
    • Timothy B. Terriberry's avatar
      Replace ec_{enc|dec}_bit_prob() with ec_{enc|dec}_bit_logp(). · e86fb268
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      All of our usage of ec_{enc|dec}_bit_prob had the probability of a
       "one" being a power of two.
      This adds a new ec_{enc|dec}_bit_logp() function that takes this
       explicitly into account.
      It introduces less rounding error than the bit_prob version, does not
       require 17-bit integers to be emulated by ec_{encode|decode}_bin(),
       and does not require any multiplies or divisions at all.
      It is exactly equivalent to
       ec_encode_bin(enc,_val?0:(1<<_logp)-1,(1<<_logp)-(_val?1:0),1<<_logp)
      
      The old ec_{enc|dec}_bit_prob functions are left in place for now,
       because I am not sure if SILK is still using them or not when
       combined in Opus.
      e86fb268
    • Timothy B. Terriberry's avatar
      Subtract one from dif in the range decoder. · 8c23a3a0
      Timothy B. Terriberry authored and Jean-Marc Valin's avatar Jean-Marc Valin committed
      It turns out to be more convenient to store dif=low+rng-code-1
       instead of dif=low+rng-code.
      This gets rid of a decrement in the normal decode path, replaces a
       decrement and an "and" in the normalization loop with a single
       add, and makes it clear that the new ec_dec_cdf() will not result
       in an infinite loop.
      This does not change the bitstream.
      8c23a3a0
  8. Dec 17, 2010
    • Timothy B. Terriberry's avatar
      Add a generic CDF decoding routine. · a0b664df
      Timothy B. Terriberry authored
      This decodes a value encoded with ec_encode_bin() without using any
       divisions.
      It is only meant for small alphabets.
      If a symbol can take on a large number of possible values, a binary
       search would be better.
      
      This patch also converts spread_decision to use it, since it is
       faster and introduces less rounding error to encode a single
       decision for the entire value than to encode it a bit at a time.
      a0b664df
  9. Sep 11, 2010
  10. Aug 02, 2010
  11. Jul 19, 2010
  12. Jul 05, 2010
  13. May 30, 2010
  14. May 27, 2010
  15. Oct 18, 2009
  16. Oct 17, 2009
  17. Jul 26, 2009
  18. Jul 23, 2009
    • Jean-Marc Valin's avatar
      Implemented "raw bits" · c08be448
      Jean-Marc Valin authored
      Making it so all the information encoded directly with ec_enc_bits() gets
      stored at the end of the stream, without going through the range coder. This
      should be both faster and reduce the effects of bit errors.
      
      Conflicts:
      
      	tests/ectest.c
      c08be448
  19. Feb 04, 2009
  20. Mar 22, 2008
  21. Jan 28, 2008
  22. Jan 11, 2008
  23. Dec 11, 2007
  24. Dec 06, 2007
Loading