9 years agoDisabling the postfilter when complexity<5 or when CELT_SET_PREDICTION<=1
Jean-Marc Valin [Thu, 3 Feb 2011 18:36:03 +0000 (13:36 -0500)]
Disabling the postfilter when complexity<5 or when CELT_SET_PREDICTION<=1

9 years agoReplaces previous commit with something safer
Jean-Marc Valin [Thu, 3 Feb 2011 15:34:30 +0000 (10:34 -0500)]
Replaces previous commit with something safer

9 years agoPatch from Tim: Prevents bits2 from going negative
Jean-Marc Valin [Thu, 3 Feb 2011 14:16:13 +0000 (09:16 -0500)]
Patch from Tim: Prevents bits2 from going negative

9 years agoRevert -export-symbols-regex 'celt_'. That probably wasn't a good idea
Jean-Marc Valin [Thu, 3 Feb 2011 12:05:30 +0000 (07:05 -0500)]
Revert -export-symbols-regex 'celt_'. That probably wasn't a good idea

And it somehow prevents Opus from building shared libraries

9 years agoRenormalize in anti-collapse only when needed
Jean-Marc Valin [Thu, 3 Feb 2011 11:42:54 +0000 (06:42 -0500)]
Renormalize in anti-collapse only when needed

9 years agoFix collapse mask tracking for recombine steps.
Timothy B. Terriberry [Thu, 3 Feb 2011 09:57:57 +0000 (01:57 -0800)]
Fix collapse mask tracking for recombine steps.

The recombine loop for cm was correct if one started at 1 block,
 but was wrong otherwise (for a test case, convert 2 recombined
 blocks back to 4 with an initial cm of 0x3; the result should be
 0xF, but instead you get 0x7).
The recombine loop for fill was always wrong (for a test case,
 combine 8 blocks down to 1 with an initial fill=0xFE; the low bit
 remains unset).
This now properly interleaves and deinterleaves bits for these
 steps, which avoids declaring collapses (and skipping folding)
 where none, in fact, occurred.

9 years agoFix short length detection.
Timothy B. Terriberry [Wed, 2 Feb 2011 19:42:33 +0000 (11:42 -0800)]
Fix short length detection.

aa6fec66 added a check to reject modes with shorts longer than
 3.33 ms (less than 300 per second).
However, it only rejected modes which could not be split at all.
This expands the check to also reject modes which, even after
 splitting the maximum amount, still do not have shorts less than
 3.33 ms.

9 years agoMore Opus build work
Jean-Marc Valin [Thu, 3 Feb 2011 05:43:37 +0000 (00:43 -0500)]
More Opus build work

9 years agoEnabling the post-filter and exporting the ec functions for Opus
Jean-Marc Valin [Thu, 3 Feb 2011 04:02:25 +0000 (23:02 -0500)]
Enabling the post-filter and exporting the ec functions for Opus

9 years agoAlso fixing the DoFs for intensity stereo
Jean-Marc Valin [Thu, 3 Feb 2011 02:23:21 +0000 (21:23 -0500)]
Also fixing the DoFs for intensity stereo

9 years agoGetting the right DoFs for dual stereo
Jean-Marc Valin [Thu, 3 Feb 2011 02:03:31 +0000 (21:03 -0500)]
Getting the right DoFs for dual stereo

9 years agoRemoving ancient allocation matrix
Jean-Marc Valin [Wed, 2 Feb 2011 03:03:26 +0000 (22:03 -0500)]
Removing ancient allocation matrix

9 years agoIncrease caps/allocation accuracy.
Timothy B. Terriberry [Wed, 2 Feb 2011 01:41:12 +0000 (17:41 -0800)]
Increase caps/allocation accuracy.

This stores the caps array in 32nd bits/sample instead of 1/2 bits
 scaled by LM and the channel count, which is slightly less
 less accurate for the last two bands, and much more accurate for
 all the other bands.
A constant offset is subtracted to allow it to represent values
 larger than 255 in 8 bits (the range of unoffset values is
In addition, this replaces the last modeline in the allocation table
 with the caps array, allowing the initial interpolation to
 allocate 8 bits/sample or more, which was otherwise impossible.

9 years agoOnly checking for a mismatch when RESYNTH is defined
Jean-Marc Valin [Wed, 2 Feb 2011 01:33:17 +0000 (20:33 -0500)]
Only checking for a mismatch when RESYNTH is defined

9 years agoLimit mode creation to supported modes.
Timothy B. Terriberry [Tue, 1 Feb 2011 23:36:59 +0000 (15:36 -0800)]
Limit mode creation to supported modes.

We did no real error checking to see if a mode is supported when it
 is created.
This patch implements checks for Jean-Marc's rules:
1) A mode must have frames at least 1ms in length (no more than
    1000 per second).
2) A mode must have shorts of at most 3.33 ms (at least 300 per
It also adds error checking to dump_modes so we report the error
 instead of crashing when we fail to create a mode.

9 years agoFixing the global stack -- and an overflow in collapse_mask
Jean-Marc Valin [Tue, 1 Feb 2011 23:00:29 +0000 (18:00 -0500)]
Fixing the global stack -- and an overflow in collapse_mask

9 years agoAdd assertions for band size restrictions.
Timothy B. Terriberry [Tue, 1 Feb 2011 20:53:05 +0000 (12:53 -0800)]
Add assertions for band size restrictions.

The way folding is implemented requires two restrictions:
1. The last band must be the largest (so we can use its size to
 allocate a temporary buffer to handle interleaving/TF changes).
2. No band can be larger than twice the size of the previous band
 (so that once we have enough data to start folding, we will always
 have enough data to fold).

Mode creation makes a heuristic attempt to satisfy these
 conditions, but nothing actually guarantees it.
This adds some asserts to check them during mode creation.
They current pass for all supported custom modes.

9 years agoDon't allow empty eBands.
Timothy B. Terriberry [Tue, 1 Feb 2011 20:32:34 +0000 (12:32 -0800)]
Don't allow empty eBands.

Currently compute_ebands()'s attempts to round bands to even sizes
 and enforce size constraints on consecutive bands can leave some
 bands entirely empty (e.g., Fs=8000, frame_size=64, i=11).
This adds a simple post-processing loop to remove such bands.

9 years agoAdds a generic CELT_SET_BITRATE() ctl() API for CBR and VBR
Jean-Marc Valin [Tue, 1 Feb 2011 22:04:27 +0000 (17:04 -0500)]
Adds a generic CELT_SET_BITRATE() ctl() API for CBR and VBR

9 years agoTuning the split threshold
Jean-Marc Valin [Tue, 1 Feb 2011 16:20:09 +0000 (11:20 -0500)]
Tuning the split threshold

9 years agoAdd a seprate qtheta offset for two-phase stereo.
Timothy B. Terriberry [Tue, 1 Feb 2011 09:55:01 +0000 (01:55 -0800)]
Add a seprate qtheta offset for two-phase stereo.

9b34bd83 caused serious regressions for 240-sample frame stereo,
 because the previous qb limit was _always_ hit for two-phase
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

9 years agoAdjust the splitting threshold.
Timothy B. Terriberry [Mon, 31 Jan 2011 18:44:03 +0000 (10:44 -0800)]
Adjust the splitting threshold.

Previously, we would only split a band if it was allocated more than
 32 bits.
However, the N=4 codebook can only produce about 22.5 bits, and two
 N=2 bands combined can only produce 26 bits, including 8 bits for
 qtheta, so if we wait until we allocate 32, we're guaranteed to fall
Several of the larger bands come pretty far from filling 32 bits as
 well, though their split versions will.

Greg Maxwell also suggested adding an offset to the threshold to
 account for the inefficiency of using qtheta compared to another
 VQ dimension.
This patch uses 1 bit as a placeholder, as it's a clear
 improvement, but we may adjust this later after collecting data on
 more possibilities over more files.

9 years agoIncluding static_mode* files in the distribution
Jean-Marc Valin [Mon, 31 Jan 2011 22:34:46 +0000 (17:34 -0500)]
Including static_mode* files in the distribution

9 years agoStop collapsing the background noise channels when switching to mono
Jean-Marc Valin [Mon, 31 Jan 2011 22:30:15 +0000 (17:30 -0500)]
Stop collapsing the background noise channels when switching to mono

9 years agoDon't destroy stereo history when switching to mono.
Timothy B. Terriberry [Mon, 31 Jan 2011 21:34:54 +0000 (13:34 -0800)]
Don't destroy stereo history when switching to mono.

The first version of the mono decoder with stereo output collapsed
 the historic energy values stored for anti-collapse down to one
 channel (by taking the max).
This means that a subsequent switch back would continue on using
 the the maximum of the two values instead of the original history,
 which would make anti-collapse produce louder noise (and
 potentially more pre-echo than otherwise).

This patch moves the max into the anti_collapse function itself,
 and does not store the values back into the source array, so the
 full stereo history is maintained if subsequent frames switch
It also fixes an encoder mismatch, which never took the max
 (assuming, apparently, that the output channel count would never

9 years agoPropagate balance from compute_allocation() to quant_all_bands().
Timothy B. Terriberry [Mon, 31 Jan 2011 20:28:12 +0000 (12:28 -0800)]
Propagate balance from compute_allocation() to quant_all_bands().

Instead of just dumping excess bits into the first band after
 allocation, use them to initialize the rebalancing loop in
This allows these bits to be redistributed over several bands, like

9 years agoFix sample type conversion when resampling
Jean-Marc Valin [Mon, 31 Jan 2011 18:41:01 +0000 (13:41 -0500)]
Fix sample type conversion when resampling

9 years agoNo longer extracting the frame size from the mode to build the header
Jean-Marc Valin [Mon, 31 Jan 2011 18:27:21 +0000 (13:27 -0500)]
No longer extracting the frame size from the mode to build the header

9 years agoMaking the stereo encoder capable of encoding in mono
Jean-Marc Valin [Mon, 31 Jan 2011 16:19:03 +0000 (11:19 -0500)]
Making the stereo encoder capable of encoding in mono

9 years agoMaking it possible for the stereo decoder to decode a mono stream
Jean-Marc Valin [Mon, 31 Jan 2011 15:51:30 +0000 (10:51 -0500)]
Making it possible for the stereo decoder to decode a mono stream

9 years agoApply band caps to the band allocation table.
Timothy B. Terriberry [Mon, 31 Jan 2011 06:27:13 +0000 (22:27 -0800)]
Apply band caps to the band allocation table.

The average caps over all values of LM and C are well below the
 target allocations of the last two modelines.
Lower them to the caps, to prevent hitting them quite so early.
This helps quality at medium-high rates, in the 180-192 kbps range.

9 years agoMore band caps updates.
Timothy B. Terriberry [Mon, 31 Jan 2011 06:18:12 +0000 (22:18 -0800)]
More band caps updates.

Use measured cross-entropy to estimate the real cost of coding
 qtheta given the allocated qb parameter, instead of the entropy of
 the PDF.
This is generally much lower, and reduces waste at high rates.
This patch also removes some intermediate rounding from this

9 years agoAdd generic fine-energy rebalancing.
Timothy B. Terriberry [Sun, 30 Jan 2011 08:12:31 +0000 (00:12 -0800)]
Add generic fine-energy rebalancing.

This extends the previous rebalancing for fine energy in N=1 bands
 to also allocate extra fine bits for bands that go over their cap.

9 years agoCustom and non-custom versions of the get_size() functions
Jean-Marc Valin [Mon, 31 Jan 2011 04:38:28 +0000 (23:38 -0500)]
Custom and non-custom versions of the get_size() functions

9 years agoMaking sure that itheta=0 or 16384 really cuts allocation to one band
Jean-Marc Valin [Mon, 31 Jan 2011 02:19:06 +0000 (21:19 -0500)]
Making sure that itheta=0 or 16384 really cuts allocation to one band

9 years agoMerge branch 'exp_api_change'
Jean-Marc Valin [Sun, 30 Jan 2011 17:15:12 +0000 (12:15 -0500)]
Merge branch 'exp_api_change'

9 years agoUse a smarter per-band bitrate cap.
Timothy B. Terriberry [Sat, 29 Jan 2011 20:57:18 +0000 (12:57 -0800)]
Use a smarter per-band bitrate cap.

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

9 years agoError handling in _create() functions
Jean-Marc Valin [Sun, 30 Jan 2011 15:23:40 +0000 (10:23 -0500)]
Error handling in _create() functions

9 years agoAdding resampling support
Jean-Marc Valin [Sat, 29 Jan 2011 15:00:20 +0000 (10:00 -0500)]
Adding resampling support

We use the MDCT as low-pass filter.

9 years agoChange qb cap to prevent side-fold collapses.
Timothy B. Terriberry [Sat, 29 Jan 2011 06:20:59 +0000 (22:20 -0800)]
Change qb cap to prevent side-fold collapses.

Previously, in a stereo split with itheta==16384, but without
 enough bits left over to actually code a pulse, the target band
 would completely collapse, because the mid gain would be zero and
 we don't fold the side.
This changes the limit to ensure that we never set qn>1 unless we
 know we'll have enough bits for at least one pulse.
This should eliminate the last possible whole-band collapse.

9 years agocelt_encoder_create() now defaults to Opus standard mode
Jean-Marc Valin [Sat, 29 Jan 2011 04:07:32 +0000 (23:07 -0500)]
celt_encoder_create() now defaults to Opus standard mode

The old constructor is renamed celt_encoder_create_custom(). Same
for the decoder.

9 years agoEnabling the standard static mode by default
Jean-Marc Valin [Sat, 29 Jan 2011 03:42:09 +0000 (22:42 -0500)]
Enabling the standard static mode by default

9 years agoAdding the auto-generated static modes for float and fixed
Jean-Marc Valin [Sat, 29 Jan 2011 03:24:40 +0000 (22:24 -0500)]
Adding the auto-generated static modes for float and fixed

9 years agoUsing the actual degrees of freedom rather than N*C for fine offset
Jean-Marc Valin [Sat, 29 Jan 2011 01:56:56 +0000 (20:56 -0500)]
Using the actual degrees of freedom rather than N*C for fine offset

9 years agoPrevent VBR from shooting up to the maximum rate if set to very low target rates...
Gregory Maxwell [Fri, 28 Jan 2011 03:35:50 +0000 (22:35 -0500)]
Prevent VBR from shooting up to the maximum rate if set to very low target rates, and prevent the encoder VBR from producing 1 byte frames (which are no longer allowed).

9 years agoDon't rebalance bits for itheta=0 or 16384
Jean-Marc Valin [Fri, 28 Jan 2011 02:43:24 +0000 (21:43 -0500)]
Don't rebalance bits for itheta=0 or 16384

9 years agoMaking rebalance a celt_int32
Jean-Marc Valin [Thu, 27 Jan 2011 23:44:26 +0000 (18:44 -0500)]
Making rebalance a celt_int32

9 years agoMaking anti-collapse a bit more conservative again
Jean-Marc Valin [Thu, 27 Jan 2011 23:05:47 +0000 (18:05 -0500)]
Making anti-collapse a bit more conservative again

The energy memory can be lowered (not increased) during a transient

9 years agoChanging some double constants to float
Jean-Marc Valin [Thu, 27 Jan 2011 22:19:49 +0000 (17:19 -0500)]
Changing some double constants to float

9 years agoAdjusting post-filter coefficients to be exact in 13 bit precision.
Jean-Marc Valin [Thu, 27 Jan 2011 22:14:33 +0000 (17:14 -0500)]
Adjusting post-filter coefficients to be exact in 13 bit precision.

That way they can be exact in 16 bits once multiplied by the gain

9 years agoAdjusting pre-emphasis coefs to be exact in 16-bit precision
Jean-Marc Valin [Thu, 27 Jan 2011 22:01:59 +0000 (17:01 -0500)]
Adjusting pre-emphasis coefs to be exact in 16-bit precision

9 years agoUsing a real 16-bit value for the coarse beta on intra frames
Jean-Marc Valin [Thu, 27 Jan 2011 21:51:20 +0000 (16:51 -0500)]
Using a real 16-bit value for the coarse beta on intra frames

9 years agoReducing waste at high bit-rate
Jean-Marc Valin [Thu, 27 Jan 2011 21:28:16 +0000 (16:28 -0500)]
Reducing waste at high bit-rate

We now encode the highest bitrate part of the split first and transfer
any unused bits to the other part. We use a dead zone of three bits
to prevent redistributing in cases of random fluctuation (or else
we will statistically lower the allocation of higher frequencies at
low-mid bitrates).

9 years agoMinor opus_compare fix
Jean-Marc Valin [Thu, 27 Jan 2011 20:50:27 +0000 (15:50 -0500)]
Minor opus_compare fix

9 years agoComparison tool for decoder compliance
Jean-Marc Valin [Thu, 27 Jan 2011 20:47:15 +0000 (15:47 -0500)]
Comparison tool for decoder compliance

9 years agoFixes fixed-point overflow on really low energy
Jean-Marc Valin [Thu, 27 Jan 2011 15:46:01 +0000 (10:46 -0500)]
Fixes fixed-point overflow on really low energy

Makes celt_exp2() use Q10 input to avoid problems on very low energy.
Also makes the pitch downsampling more conservative on gain to avoid
problems later.

9 years agoFixes a fixed-point overflow in anti-collapse
Jean-Marc Valin [Thu, 27 Jan 2011 14:53:09 +0000 (09:53 -0500)]
Fixes a fixed-point overflow in anti-collapse

9 years agoImprove accuracy of update_lowband test.
Timothy B. Terriberry [Thu, 27 Jan 2011 04:32:53 +0000 (20:32 -0800)]
Improve accuracy of update_lowband test.

9 years agoOnly allowing silence in non-hybrid mode.
Jean-Marc Valin [Thu, 27 Jan 2011 03:04:59 +0000 (22:04 -0500)]
Only allowing silence in non-hybrid mode.

Also defining a 1-byte packet as triggering the PLC/CNG

9 years agoMore anti-collapse fixes, as well as a fold fix.
Timothy B. Terriberry [Wed, 26 Jan 2011 07:05:04 +0000 (23:05 -0800)]
More anti-collapse fixes, as well as a fold fix.

This changes folding so that the LCG is never used on transients
 (either short blocks or long blocks with increased time
 resolution), except in the case that there's not enough decoded
 spectrum to fold yet.

It also now only subtracts the anti-collapse bit from the total
 allocation in quant_all_bands() when space has actually been
 reserved for it.

Finally, it cleans up some of the fill and collapse_mask tracking
 (this tracking was originally made intentionally sloppy to save
 work, but then converted to replace the existing fill flag at the
 last minute, which can have a number of logical implications).
The changes, in particular:
1) Splits of less than a block now correctly mark the second half
    as filled only if the whole block was filled (previously it
    would also mark it filled if the next block was filled).
2) Splits of less than a block now correctly mark a block as
    un-collapsed if either half was un-collapsed, instead of marking
    the next block as un-collapsed when the high half was.
3) The N=2 stereo special case now keeps its fill mask even when
    itheta==16384; previously this would have gotten cleared,
    despite the fact that we fold into the side in this case.
4) The test against fill for folding now only considers the bits
    corresponding to the current set of blocks.
   Previously it would still fold if any later block was filled.
5) The collapse mask used for the LCG fold data is now correctly
    initialized when B=16 on platforms with a 16-bit int.
6) The high bits on a collapse mask are now cleared after the TF
    resolution changes and interleaving at level 0, instead of
    waiting until the very end.
   This prevents extraneous high flags set on mid from being mixed
    into the side flags for mid-side stereo.

9 years agoSetting bandE[] to zero after log2Amp when silence=1
Jean-Marc Valin [Thu, 27 Jan 2011 01:30:21 +0000 (20:30 -0500)]
Setting bandE[] to zero after log2Amp when silence=1

9 years agoFixes for silence handling in VBR mode, plus an encoder/decoder desync triggered...
Gregory Maxwell [Thu, 27 Jan 2011 01:19:01 +0000 (20:19 -0500)]
Fixes for silence handling in VBR mode, plus an encoder/decoder desync triggered by silent frames.

9 years agoRemoving more unused function params
Jean-Marc Valin [Wed, 26 Jan 2011 18:09:53 +0000 (13:09 -0500)]
Removing more unused function params

9 years agoRemoves explicit filling of remaining bits with zeros
Jean-Marc Valin [Wed, 26 Jan 2011 15:58:33 +0000 (10:58 -0500)]
Removes explicit filling of remaining bits with zeros

The initialiser already takes care of this

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