9 years agoRemoves unused function parameters
Jean-Marc Valin [Wed, 26 Jan 2011 15:50:55 +0000 (10:50 -0500)]
Removes unused function parameters

9 years agoShould avoid running log2Amp on uninitialized data
Jean-Marc Valin [Wed, 26 Jan 2011 15:00:28 +0000 (10:00 -0500)]
Should avoid running log2Amp on uninitialized data

9 years agoAdding a special way to code digital silence in two or more bytes
Jean-Marc Valin [Wed, 26 Jan 2011 14:24:33 +0000 (09:24 -0500)]
Adding a special way to code digital silence in two or more bytes

9 years agoRemove // comment
Jean-Marc Valin [Wed, 26 Jan 2011 02:43:23 +0000 (21:43 -0500)]
Remove // comment

9 years agoanti-collapse tuning
Jean-Marc Valin [Wed, 26 Jan 2011 00:12:06 +0000 (19:12 -0500)]
anti-collapse tuning

Using the min energy of the two last non-transient frames rather
than the min of just the two last frames. Also slightly increasing
the "thresh" upper bound coefficient to 0.5.

9 years agoOops, fixed the sqrt(2) constant for anti_collapse()
Jean-Marc Valin [Tue, 25 Jan 2011 20:58:58 +0000 (15:58 -0500)]
Oops, fixed the sqrt(2) constant for anti_collapse()

9 years agoMinimum period is now 15
Jean-Marc Valin [Tue, 25 Jan 2011 18:11:36 +0000 (13:11 -0500)]
Minimum period is now 15

9 years agoTaking LM into account for anti-collapse
Jean-Marc Valin [Mon, 24 Jan 2011 22:21:12 +0000 (17:21 -0500)]
Taking LM into account for anti-collapse

9 years agoFix off-by-one error in ec_laplace_encode.
Timothy B. Terriberry [Mon, 24 Jan 2011 20:50:30 +0000 (12:50 -0800)]
Fix off-by-one error in ec_laplace_encode.

di_max was counting the _number_ of code-points remaining, not the
 largest one that could be used.

9 years agoMoving energy floor to coarse quantization
Jean-Marc Valin [Mon, 24 Jan 2011 20:53:17 +0000 (15:53 -0500)]
Moving energy floor to coarse quantization

By moving the energy floor to the encoder, we can use a different
floor for prediction than for the decay level. Also, the fixed-point
dynamic range has been increased to avoid overflows when a fixed-point
decoder is used on a stream encoded in floating-point.

9 years agoClipping the encoder input to +/-2 to prevent scaling errors
Jean-Marc Valin [Sun, 23 Jan 2011 23:22:14 +0000 (18:22 -0500)]
Clipping the encoder input to +/-2 to prevent scaling errors

If someone messed up scaling, they'll know because it'll sound bad

9 years agoprefilter/postfilter now forced off in Opus hybrid mode
Jean-Marc Valin [Sun, 23 Jan 2011 16:34:55 +0000 (11:34 -0500)]
prefilter/postfilter now forced off in Opus hybrid mode

9 years agoSimple DTX/CNG implementation
Jean-Marc Valin [Sun, 23 Jan 2011 05:24:45 +0000 (00:24 -0500)]
Simple DTX/CNG implementation

9 years agoConsidering "badness" in two-pass quant_coarse_energy().
Jean-Marc Valin [Sun, 23 Jan 2011 03:29:25 +0000 (22:29 -0500)]
Considering "badness" in two-pass quant_coarse_energy().

The most important thing is to not screw up the energy. Then we
compare the bit-rates.

9 years agoStop uselessly calling haar1() when resynth=0
Jean-Marc Valin [Sun, 23 Jan 2011 02:22:03 +0000 (21:22 -0500)]
Stop uselessly calling haar1() when resynth=0

This was computing on uninitialized data (though the result was never

9 years agoPrevent out of bounds access to collapse_masks.
Gregory Maxwell [Sun, 23 Jan 2011 01:16:43 +0000 (20:16 -0500)]
Prevent out of bounds access to collapse_masks.

9 years agoCorrect an encoder/decoder mismatch at low volume levels. Relax some low level clamps...
Gregory Maxwell [Sat, 22 Jan 2011 19:57:51 +0000 (14:57 -0500)]
Correct an encoder/decoder mismatch at low volume levels. Relax some low level clamps so that the dynamic range can extend further below the 16bit floor.

9 years agoTracking the background noise level
Jean-Marc Valin [Sat, 22 Jan 2011 19:48:20 +0000 (14:48 -0500)]
Tracking the background noise level

Also a fix for the zero-ing of unused band energies.

9 years agoDefining merge_stereo() when S==-M or S==M
Jean-Marc Valin [Fri, 21 Jan 2011 23:41:48 +0000 (18:41 -0500)]
Defining merge_stereo() when S==-M or S==M

9 years agoFix collapse_masks overflow for mono.
Timothy B. Terriberry [Fri, 21 Jan 2011 07:08:31 +0000 (23:08 -0800)]
Fix collapse_masks overflow for mono.

We were always storing collapse_masks[i*C+1], which could have
 overflowed the buffer on the last band in mono.
This also moves the stores outside the conditional, which allows
 common code to be used for masking the high bits, address
 generation, etc.

9 years agoReorders some operations in anti-collapse to reuse values
Jean-Marc Valin [Fri, 21 Jan 2011 05:07:03 +0000 (00:07 -0500)]
Reorders some operations in anti-collapse to reuse values

9 years agoPrevents taking the log of zero in fixed-point
Jean-Marc Valin [Fri, 21 Jan 2011 05:02:10 +0000 (00:02 -0500)]
Prevents taking the log of zero in fixed-point

9 years agoUsing previous range coder state for PRNG
Jean-Marc Valin [Fri, 21 Jan 2011 03:52:55 +0000 (22:52 -0500)]
Using previous range coder state for PRNG

This provides more entropy and allows some more flexibility on the
encoder side.

9 years agoFixes an irrelevant uninitialized bug
Jean-Marc Valin [Thu, 20 Jan 2011 01:47:01 +0000 (20:47 -0500)]
Fixes an irrelevant uninitialized bug

9 years agoRemove useless ec_dec_tell() call.
Timothy B. Terriberry [Tue, 18 Jan 2011 18:44:35 +0000 (10:44 -0800)]
Remove useless ec_dec_tell() call.

9 years agoMake collapse-detection bitexact.
Timothy B. Terriberry [Thu, 20 Jan 2011 00:30:03 +0000 (16:30 -0800)]
Make collapse-detection bitexact.

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

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.

9 years agoAdds an anti-collapse mechanism for transients
Jean-Marc Valin [Tue, 18 Jan 2011 19:44:04 +0000 (14:44 -0500)]
Adds an anti-collapse mechanism for transients

This looks for bands in each short block that have no energy. For
each of these "collapsed" bands, noise is injected to have an
energy equal to the minimum of the two previous frames for that band.
The mechanism can be used whenever there are 4 or more MDCTs (otherwise
no complete collapse is possible) and is signalled with one bit just
before the final fine energy bits.

9 years agoMoving the tapset signalling to the beginning of the stream
Jean-Marc Valin [Tue, 18 Jan 2011 01:50:18 +0000 (20:50 -0500)]
Moving the tapset signalling to the beginning of the stream

9 years agoAdding tapset decision logic
Jean-Marc Valin [Mon, 17 Jan 2011 21:37:51 +0000 (16:37 -0500)]
Adding tapset decision logic

Based on spreading_decision()'s logic. We choose tapsets
with less roll-off when we think the HF are tonal.

9 years agoSupport for multiple postfilter tapsets
Jean-Marc Valin [Mon, 17 Jan 2011 16:37:08 +0000 (11:37 -0500)]
Support for multiple postfilter tapsets

Supporting three different tapsets with different roll-offs. The default
is now a 5-tap post-filter with a 13 kHz cutoff frequency.

9 years agoIn CVBR mode the rate selection was failing to add bytes which were about to fall...
Gregory Maxwell [Thu, 13 Jan 2011 19:38:24 +0000 (14:38 -0500)]
In CVBR mode the rate selection was failing to add bytes which were about to fall off the end of the bitres and never be reusable, causing undershoot.

9 years agoSetting oldBandE to zero outside of [start,end[
Jean-Marc Valin [Thu, 13 Jan 2011 21:15:53 +0000 (16:15 -0500)]
Setting oldBandE to zero outside of [start,end[

In case start or end changes, we want the encoder and decoder
to be in sync and not do anything stupid.

9 years agoMinor code cleanup, nothing to see here
Jean-Marc Valin [Thu, 13 Jan 2011 20:01:54 +0000 (15:01 -0500)]
Minor code cleanup, nothing to see here

9 years agoProper scaling for the mid folding
Jean-Marc Valin [Thu, 13 Jan 2011 18:22:02 +0000 (13:22 -0500)]
Proper scaling for the mid folding

Nor scaling the mid only after we've been able to store it
for folding.

9 years agoReplace log2_frac in the delta offset calculation.
Timothy B. Terriberry [Thu, 13 Jan 2011 00:34:34 +0000 (16:34 -0800)]
Replace log2_frac in the delta offset calculation.

Adds a new bitexact_log2tan() function which is much simpler, and
 more accurate.
The new approximation has an RMS error of 0.0038 bits from the
 correctly rounded result over the range of inputs we use, compared
 to an RMS error of 0.013 for the old log2_frac() method.
The actual computation of delta is also changed to use FRAC_MUL16,
 since this allows us to keep the full accuracy of the new method
 while avoiding 16-bit overflow.
The old delta computation actually could overflow 16 bits: it needed
 8 for the log2_frac() result, 1 for the sign of the difference, and
 8 more for N.

9 years agoAllowing the tf recombining to go all the way to LM=3
Jean-Marc Valin [Wed, 12 Jan 2011 21:13:46 +0000 (16:13 -0500)]
Allowing the tf recombining to go all the way to LM=3

9 years agoFixes constrained VBR
Jean-Marc Valin [Wed, 12 Jan 2011 16:27:03 +0000 (11:27 -0500)]
Fixes constrained VBR

Also removes the 8 byte/packet lower bound

9 years agoEnforces bands of even size even for custom modes
Jean-Marc Valin [Wed, 12 Jan 2011 14:22:29 +0000 (09:22 -0500)]
Enforces bands of even size even for custom modes

9 years agoUsing a step pdf for the stereo itheta encoding
Jean-Marc Valin [Tue, 11 Jan 2011 22:05:07 +0000 (17:05 -0500)]
Using a step pdf for the stereo itheta encoding

9 years agoMinor fixes to testcases
Jean-Marc Valin [Tue, 11 Jan 2011 14:42:28 +0000 (09:42 -0500)]
Minor fixes to testcases

9 years agoAdd --export-symbols-regex
David Schleef [Sun, 2 Jan 2011 04:03:10 +0000 (20:03 -0800)]
Add --export-symbols-regex

9 years agoMSVC build fixes
David Schleef [Sun, 2 Jan 2011 03:52:20 +0000 (19:52 -0800)]
MSVC build fixes

9 years agoUse more standard test for lrintf/lrint
David Schleef [Sun, 2 Jan 2011 03:47:50 +0000 (19:47 -0800)]
Use more standard test for lrintf/lrint

9 years agoFixes the recombining stride and the deinterleaving stride
Jean-Marc Valin [Tue, 11 Jan 2011 14:20:39 +0000 (09:20 -0500)]
Fixes the recombining stride and the deinterleaving stride

Previously, recombining only worked when going all the way back to
frequency domain.

9 years agoUsing intensity_stereo() when itheta==0
Jean-Marc Valin [Tue, 11 Jan 2011 11:39:44 +0000 (06:39 -0500)]
Using intensity_stereo() when itheta==0

9 years agoDefines MAX_FINE_BITS to ensure that we're using the same value everywhere
Jean-Marc Valin [Mon, 10 Jan 2011 18:21:04 +0000 (13:21 -0500)]
Defines MAX_FINE_BITS to ensure that we're using the same value everywhere

9 years agoUsing tell() rather than log2_frac() to compute qalloc
Jean-Marc Valin [Mon, 10 Jan 2011 17:45:01 +0000 (12:45 -0500)]
Using tell() rather than log2_frac() to compute qalloc

9 years agoChanges the N=2 stereo case to use the same sign convention as N=1
Jean-Marc Valin [Mon, 10 Jan 2011 15:52:51 +0000 (10:52 -0500)]
Changes the N=2 stereo case to use the same sign convention as N=1

9 years agoMax delta: +/- 16384
Jean-Marc Valin [Mon, 10 Jan 2011 15:35:31 +0000 (10:35 -0500)]
Max delta: +/- 16384

9 years ago32-bit fixes
Jean-Marc Valin [Mon, 10 Jan 2011 15:34:20 +0000 (10:34 -0500)]
32-bit fixes

9 years agoMake LCG 16-bit clean
Jean-Marc Valin [Mon, 10 Jan 2011 15:02:58 +0000 (10:02 -0500)]
Make LCG 16-bit clean

9 years agoProperly skip padding in testcelt for stereo.
Timothy B. Terriberry [Mon, 10 Jan 2011 04:04:12 +0000 (20:04 -0800)]
Properly skip padding in testcelt for stereo.

The right amount of data was being written for the first frame, but
 from the wrong offset in the buffer.

9 years agoPrevent busts at low bitrates.
Timothy B. Terriberry [Fri, 7 Jan 2011 17:18:34 +0000 (09:18 -0800)]
Prevent busts at low bitrates.

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().

9 years agoFix Jean-Marc's sqrt(0.5) constants.
Timothy B. Terriberry [Sun, 9 Jan 2011 06:11:46 +0000 (22:11 -0800)]
Fix Jean-Marc's sqrt(0.5) constants.

There were two different ones in use, one with less precision than
 a float, and the other missing a digit in the middle.

9 years agoTuning the split allocation for temporal masking
Jean-Marc Valin [Sun, 9 Jan 2011 06:27:07 +0000 (01:27 -0500)]
Tuning the split allocation for temporal masking

9 years agoUse B0 instead of B for decisions in quant_band().
Timothy B. Terriberry [Tue, 4 Jan 2011 18:26:15 +0000 (10:26 -0800)]
Use B0 instead of B for decisions in quant_band().

B contains the number of blocks _after_ splitting.
We were using it to decide a) when to use a uniform PDF instead of a
 triangular one for theta and b) whether to bias the bit allocation
 towards the lower bins.
Using B0 (the number of blocks before the split) instead for a)
 gives a PEAQ gain of 0.003 ODG (as high as 0.1 ODG on s02a samples
 006, 083, and 097) for 240-sample frames at 96kbps mono.
Using B0 instead for b) gives a gain of only 0.00002.

9 years agoFix rounding in bits2pulses search.
Timothy B. Terriberry [Tue, 4 Jan 2011 17:07:40 +0000 (09:07 -0800)]
Fix rounding in bits2pulses search.

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
I.e., the binary search loop can now be replaced with
 and it will give equivalent results.
This was not true before.

9 years agoChanges to ec_dec_cdf() to support 8-bit tables.
Timothy B. Terriberry [Mon, 3 Jan 2011 00:53:28 +0000 (16:53 -0800)]
Changes to ec_dec_cdf() to support 8-bit tables.

This renames ec_dec_cdf() to ec_dec_icdf(), and changes the
 functionality to use an "inverse" CDF table, where
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.

9 years agoCode intensity offset relative to start.
Timothy B. Terriberry [Thu, 30 Dec 2010 17:06:22 +0000 (09:06 -0800)]
Code intensity offset relative to start.

The band where intensity stereo begins was being coded as an
 absolute value, rather than relative to start, even though the
 range of values in the bitstream was limited as if it was being
 coded relative to start (meaning there would be desync if
 intensity was sufficiently large).

9 years agoMake the dynalloc boost run over [start,end).
Timothy B. Terriberry [Thu, 30 Dec 2010 17:04:16 +0000 (09:04 -0800)]
Make the dynalloc boost run over [start,end).

Previously it was coded for all bands, even when not all of them
 were being used.

9 years agoFix the limits for CELT_SET_END_BAND_REQUEST.
Timothy B. Terriberry [Thu, 30 Dec 2010 16:56:49 +0000 (08:56 -0800)]
Fix the limits for CELT_SET_END_BAND_REQUEST.

The valid bands range from [start,end) everywhere, with start<end.
Therefore end should never be 0, and should be allowed to extend
 all the way to mode->nbEBands.
This patch does _not_ enforce that start<end, and it does _not_
 handle clearing oldBandE[] when the valid range changes, which
 are separate issues.

9 years agoUpdate the maximum fine bits everywhere.
Timothy B. Terriberry [Thu, 30 Dec 2010 16:43:42 +0000 (08:43 -0800)]
Update the maximum fine bits everywhere.

cf874373 raised the limit from 7 to 8 for N>1 bands in
 interp_bits2pulses(), but did not raise the corresponding limits
 for N=1 bands, or for [un]quant_energy_finalise().
This commit raises all of the limits to the same value, 8.

9 years agoMove fine_priority calculation after the bust cap.
Timothy B. Terriberry [Thu, 30 Dec 2010 16:38:48 +0000 (08:38 -0800)]
Move fine_priority calculation after the bust cap.

This way if a band doesn't get the fine bits we want because it
 wasn't allocated enough bits to start with, then we will still
 give it priority for any spare bits after PVQ.

9 years agoFixing stereo renormalisation
Jean-Marc Valin [Wed, 29 Dec 2010 20:19:58 +0000 (15:19 -0500)]
Fixing stereo renormalisation

Compensate for the fact that the side "energy" is not preserved
when the split ends up starving one segment.

9 years agoMove tf_select before the tf_res bits.
Timothy B. Terriberry [Tue, 28 Dec 2010 02:20:20 +0000 (18:20 -0800)]
Move tf_select before the tf_res bits.

The tf_res bits are useless without tf_select, so move it up before
This allows the tf_res bits to be interpreted directly as they're

9 years agoFixes tf_select_table[][] (missing commas)
Jean-Marc Valin [Mon, 27 Dec 2010 21:33:38 +0000 (16:33 -0500)]
Fixes tf_select_table[][] (missing commas)

9 years agoMinor tweaks to the max allocation
Jean-Marc Valin [Wed, 22 Dec 2010 06:03:43 +0000 (01:03 -0500)]
Minor tweaks to the max allocation

9 years agoRemoving FIXMEs that were fixed
Jean-Marc Valin [Wed, 22 Dec 2010 03:27:08 +0000 (22:27 -0500)]
Removing FIXMEs that were fixed

9 years agoClean up some type usage.
Timothy B. Terriberry [Thu, 23 Dec 2010 19:01:22 +0000 (11:01 -0800)]
Clean up some type usage.

ec_byte_read() ec_byte_read_from_end() had different return types.
ec_dec_bits() was storing its return value as int instead of
 ec_uint32, which will break if int is only 16 bits.

9 years agoUse _BitScanReverse for EC_ILOG with MSVC.
Timothy B. Terriberry [Thu, 23 Dec 2010 16:06:48 +0000 (08:06 -0800)]
Use _BitScanReverse for EC_ILOG with MSVC.

Also updates the TI dsplib macros to use the same EC_CLZ mechanism
 as everything else.

9 years agoUpdate ec_dec_cdf() to use an unsigned cdf[].
Timothy B. Terriberry [Wed, 22 Dec 2010 01:45:08 +0000 (17:45 -0800)]
Update ec_dec_cdf() to use an unsigned cdf[].

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.

9 years agoAdd test coverage for entropy coder compatibility.
Timothy B. Terriberry [Wed, 22 Dec 2010 01:30:45 +0000 (17:30 -0800)]
Add test coverage for entropy coder compatibility.

This ensures that the various alternative routines in the entropy
 encoder and decoder (e.g., ec_{enc|dec}_bit_logp()) really are
 just specialized optimizations of the same general ec_encode()
 and ec_decode() routines.
This is done by randomly picking one to encode with for each symbol,
 and randomly picking a different one to decode with.

9 years agoFix a typo in ec_byte_write_done().
Timothy B. Terriberry [Wed, 22 Dec 2010 00:36:31 +0000 (16:36 -0800)]
Fix a typo in ec_byte_write_done().

Introduced by 30df6cf3.
This should have only affected the output in the case where the last
 few extra bits caused us to bust, and wouldn't have prevented us
 from detecting the error.

9 years agoDon't enable the post-filter in Opus hybrid mode
Jean-Marc Valin [Tue, 21 Dec 2010 21:30:01 +0000 (16:30 -0500)]
Don't enable the post-filter in Opus hybrid mode

9 years agoEntropy coder clean-up.
Timothy B. Terriberry [Tue, 21 Dec 2010 16:42:26 +0000 (08:42 -0800)]
Entropy coder clean-up.

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).

9 years agoAdded highest allocation line possible
Jean-Marc Valin [Tue, 21 Dec 2010 16:28:23 +0000 (11:28 -0500)]
Added highest allocation line possible

9 years agoOrdering Hadamard frequencies when increasing the time-resolution.
Jean-Marc Valin [Tue, 21 Dec 2010 06:04:11 +0000 (01:04 -0500)]
Ordering Hadamard frequencies when increasing the time-resolution.

This means we're "time-ordered" in all cases except when increasing
the time resolution on frames that already use short blocks.
There's no reordering when increasing the frequency resolution
on short blocks.

9 years agoTuning the dynamic allocation probability and increment
Jean-Marc Valin [Tue, 21 Dec 2010 05:19:31 +0000 (00:19 -0500)]
Tuning the dynamic allocation probability and increment

Dynalloc becomes 2x more likely every time we use it, until it
reaches a probability of 1/4. Allocation increments now have
a floor of 1/8 bit/sample and a ceiling of 1 bit/sample.

9 years agoBump bit-stream version
Jean-Marc Valin [Mon, 20 Dec 2010 21:58:29 +0000 (16:58 -0500)]
Bump bit-stream version

9 years agoBump to 0.10
Jean-Marc Valin [Mon, 20 Dec 2010 16:40:50 +0000 (11:40 -0500)]
Bump to 0.10

9 years agoBeing a bit more careful about enabling the post-filter
Jean-Marc Valin [Mon, 20 Dec 2010 16:40:30 +0000 (11:40 -0500)]
Being a bit more careful about enabling the post-filter

9 years agoTurning noise filling back on for cases where we have no data to fold with
Jean-Marc Valin [Mon, 20 Dec 2010 02:36:32 +0000 (21:36 -0500)]
Turning noise filling back on for cases where we have no data to fold with

9 years agoEliminate some divisions from rate.c.
Gregory Maxwell [Sun, 19 Dec 2010 07:50:12 +0000 (02:50 -0500)]
Eliminate some divisions from rate.c.

9 years agoFix for the allocation going negative. (bits[j] >= 0 assert)
Gregory Maxwell [Sun, 19 Dec 2010 07:26:56 +0000 (02:26 -0500)]
Fix for the allocation going negative. (bits[j] >= 0 assert)

 The modeline-bisection and interpolator have used different criteria
for the minimum coding threshold since the introduction of the
"backwards done" in 405e6a99. This meant that a lower modeline could be
selected which the interpolator was never able to get under the maximum
allocation. This patch makes the modeline selection search use the same
criteria as the interpolator.

9 years agoMore simplifications to the decoder renormalization loop.
Timothy B. Terriberry [Sat, 18 Dec 2010 12:51:55 +0000 (04:51 -0800)]
More simplifications to the decoder renormalization loop.

This removes an XOR, an ADD, and an AND, and replaces them with
 an AND NOT in ec_dec_normalize().
Also, simplify the loop structure of ec_dec_cdf() and eliminate a

9 years agoReplace ec_{enc|dec}_bit_prob() with ec_{enc|dec}_bit_logp().
Timothy B. Terriberry [Fri, 17 Dec 2010 22:50:19 +0000 (14:50 -0800)]
Replace ec_{enc|dec}_bit_prob() with ec_{enc|dec}_bit_logp().

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

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.

9 years agoSubtract one from dif in the range decoder.
Timothy B. Terriberry [Fri, 17 Dec 2010 22:32:00 +0000 (14:32 -0800)]
Subtract one from dif in the range decoder.

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.

9 years agoAdd a generic CDF decoding routine.
Timothy B. Terriberry [Fri, 17 Dec 2010 18:49:00 +0000 (10:49 -0800)]
Add a generic CDF decoding routine.

This decodes a value encoded with ec_encode_bin() without using any
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.

9 years agoGiving less bits to single-bin bands.
Jean-Marc Valin [Fri, 17 Dec 2010 19:17:27 +0000 (14:17 -0500)]
Giving less bits to single-bin bands.

This improves the allocation for 2.5 ms frames.

9 years agoFixed the spreading probabilities (1-x)
Jean-Marc Valin [Fri, 17 Dec 2010 18:38:20 +0000 (13:38 -0500)]
Fixed the spreading probabilities (1-x)

9 years agoRe-organize spreading/folding constants.
Timothy B. Terriberry [Fri, 17 Dec 2010 13:52:06 +0000 (05:52 -0800)]
Re-organize spreading/folding constants.

These were stored internally in one order and in the bitstream in a
 different order.
Both used bare constants, making it unclear what either actually
This changes them to use the same order, gives them named constants,
 and renames all the "fold" decision stuff to "spread" instead,
 since that is what it is really controlling.

9 years agoRe-enabling post-filter on 2.5 ms frames
Jean-Marc Valin [Fri, 17 Dec 2010 03:29:35 +0000 (22:29 -0500)]
Re-enabling post-filter on 2.5 ms frames

Also, now forcing MS stereo for 2.5 frames because the current
analysis isn't reliable.

9 years agoMore cleanups to compute_allocation().
Timothy B. Terriberry [Fri, 17 Dec 2010 00:50:16 +0000 (16:50 -0800)]
More cleanups to compute_allocation().

The bisection search in compute_allocation() was not using the same
 method to count psum as interp_bits2pulses, i.e., it did not
 include the 64*C<<BITRES<<LM allocation ceiling (this adds at most
 84 max operations/frame, and so should have a trivial CPU cost).
Again, I wouldn't want to try to explain why these are different in
 a spec, so let's make them the same.

In addition, the procedure used to fill in bits1 and bits2 after the
 bisection search was not the same as the one used during the
 bisection search.
I.e., the
      if (bits1[j] > 0)
               bits1[j] += trim_offset[j];
 step was not also done for bits2, so bits1[j] + bits2[j] would not
 be equal to what was computed earlier for the hi line, and would
 not be guaranteed to be larger than total.
We now compute both allocation lines in the same manner, and then
 obtain bits2 by subtracting them, instead of trying to compute the
 offset from bits1 up front.

Finally, there was nothing to stop a bitstream from boosting a band
 beyond the number of bits remaining, which means that bits1 would
 not produce an allocation less than or equal to total, which means
 that some bands would receive a negative allocation in the decoder
 when the "left over" negative bits were redistributed to other
This patch only adds the dynalloc offset to allocation lines greater
 than 0, so that an all-zeros floor still exists; the effect is that
 a dynalloc boost gets linearly scaled between allocation lines 0 and
 1, and is constant (like it was before) after that.
We don't have to add the extra condition to the bisection search,
 because it never examines allocation line 0.
This re-writes the indexing in the search to make that explicit;
 it was tested and gives exactly the same results in exactly the
 same number of iterations as the old search.

9 years agoGive the bit we reserved to end skipping back when we don't use it.
Timothy B. Terriberry [Thu, 16 Dec 2010 22:39:58 +0000 (14:39 -0800)]
Give the bit we reserved to end skipping back when we don't use it.

Commit 8e447678 increased the number of cases where we end skipping
 without explicit signaling.
Before, this would cause the bit we reserved for this purpose to
 either a) get grabbed by some N=1 band to code its sign bits or
 b) wind up as part of the fine energy at the end.
This patch gives it back to the band where we stopped skipping,
 which is either the first band, or a band that was boosted by
This allows the bit to be used for shape coding in that band, and
 allows the better computation of the fine offset, since the band
 knows it will get that bit in advance.

With this change, we now guarantee that the number of bits allocated
 by compute_allocation() is exactly equal to the input total, less
 the bits consumed by skip flags during allocation itself (assuming
 total was non-negative; for negative total, no bits are emitted,
 and no bits are allocated).

9 years agoMaking lower sampling rates use the same allocation table
Jean-Marc Valin [Thu, 16 Dec 2010 21:45:35 +0000 (16:45 -0500)]
Making lower sampling rates use the same allocation table

9 years agoTerminate the coding of skip bits at the last dynalloc boosted band. Otherwise the...
Gregory Maxwell [Thu, 16 Dec 2010 19:22:51 +0000 (14:22 -0500)]
Terminate the coding of skip bits at the last dynalloc boosted band. Otherwise the bitstream allows non-sensible behavior by the encoder (dynallocing bits into a band and then skipping it). This reduces skip bit overhead by about 2-3% at moderate bitrates with the current encoder.

9 years agoMaking the encoder fail less often at stupidly low bit-rates
Jean-Marc Valin [Thu, 16 Dec 2010 19:40:14 +0000 (14:40 -0500)]
Making the encoder fail less often at stupidly low bit-rates

9 years agoComments, low bit-rate busting avoidance
Jean-Marc Valin [Thu, 16 Dec 2010 19:11:48 +0000 (14:11 -0500)]
Comments, low bit-rate busting avoidance

9 years agoSetting fine_priority for skipped bands
Jean-Marc Valin [Thu, 16 Dec 2010 18:07:29 +0000 (13:07 -0500)]
Setting fine_priority for skipped bands

9 years agoRebalance N=1 allocations during interp_bits2pulses().
Timothy B. Terriberry [Thu, 16 Dec 2010 16:39:37 +0000 (08:39 -0800)]
Rebalance N=1 allocations during interp_bits2pulses().

Excess fractions of a bit can't be re-used in N=1 bands during
 quant_all_bands() because there's no shape, only a sign bit.
This meant that all the fractional bits in these bands accumulated,
 often up to 5 or 6 bits for stereo, until the first band with N>1,
 where they were dumped all at once.
This patch moves the rebalancing for N=1 bands to
 interp_bits2pulses() instead, where excess bits still have a
 chance to be moved into fine energy.