Commit graph

445 commits

Author SHA1 Message Date
Jean-Marc Valin
034efa523a 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.
2010-12-21 00:20:39 -05:00
Jean-Marc Valin
6ba0b350fb Being a bit more careful about enabling the post-filter 2010-12-20 11:40:30 -05:00
Timothy B. Terriberry
e86fb268b0 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
 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.
2010-12-18 09:06:06 -05:00
Timothy B. Terriberry
a0b664df3d Add a generic CDF decoding routine.
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.
2010-12-17 14:21:43 -05:00
Jean-Marc Valin
f33a7fb8e0 Fixed the spreading probabilities (1-x) 2010-12-17 13:38:20 -05:00
Timothy B. Terriberry
320cf2e2cd 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
 meant.
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.
2010-12-17 10:35:51 -05:00
Jean-Marc Valin
cd84e3d0f4 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.
2010-12-16 22:29:35 -05:00
Timothy B. Terriberry
76ea41e17f 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
 dynalloc.
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).
2010-12-16 20:20:04 -05:00
Jean-Marc Valin
5c80391b35 Comments, low bit-rate busting avoidance 2010-12-16 14:11:48 -05:00
Timothy B. Terriberry
4777f06910 Store the total budget of compute_allocation in BITRES units.
The margin of safety was supposed to be 1/8th bit, not 1 bit, and the
 bit we reserved to terminate skip signalling before was actually 8
 bits.
This patch updates the margin of safety to the correct value and
 accounts for the one bit (not 8) needed for skip signalling.
It also fixes the remainder calculation in the skip loop to work
 correctly when start>0.
2010-12-15 10:04:45 -05:00
Timothy B. Terriberry
b2f59009f6 Move skip coding into interp_bits2pulses().
This allows us to a) not pay a coding cost to avoid skipping bands that are
 stupid to skip (e.g., the first band, or bands that have so few bits that we
 wouldn't redistribute anything) and b) not reserve bits to pay that cost.
2010-12-15 08:35:22 -05:00
Jean-Marc Valin
6cbfbc383a Tuning for 2.5 ms frames 2010-12-14 11:53:39 -05:00
Jean-Marc Valin
70d30ffc09 Using overlap=shortMdctSize even for 2.5 ms frames.
And fixed a post-filter bug for that special case.
2010-12-13 13:52:06 -05:00
Jean-Marc Valin
546dfa1959 Adapting the allocation trim based on the spectral tilt 2010-12-10 17:18:17 -05:00
Jean-Marc Valin
dfd6e714f9 Adding some hysteresis on the folding threshold frequency
This adds some side-information that can be used to change the
threshold freq arbitrarily.
2010-12-09 23:23:34 -05:00
Jean-Marc Valin
fddc521a5c Completely new transient analysis algorithm
Should be more robust to closely-spaced transients
2010-12-09 14:48:02 -05:00
Jean-Marc Valin
79b34eb83e Add API support for unconstrained VBR
celtenc now defaults to unconstrained VBR.
2010-12-05 17:22:06 -05:00
Jean-Marc Valin
9faf740882 Keeping the allocation of the intensity-codec bands
Also some code to select between constrained and unconstrained VBR
2010-12-04 10:27:22 -05:00
Jean-Marc Valin
a4badac92e Making VBR slightly exceed the budget rather than fail 2010-12-03 15:20:11 -05:00
Jean-Marc Valin
30165bbae0 Fixing the most obvious problems with the VBR code 2010-12-03 14:35:59 -05:00
Jean-Marc Valin
e5e9aa7985 Fixes some side-information rate control issues in VBR mode 2010-12-02 16:09:51 -05:00
Jean-Marc Valin
e65978fea7 Adding a dual stereo option.
Left and right are coded independently.
2010-12-02 13:52:20 -05:00
Jean-Marc Valin
1bfa18cb92 Fix totally broken bit allocation for non-mainstream modes (e.g. powers of two).
Also, making per-band dynamic allocation less aggressive.
2010-12-01 16:11:38 -05:00
Jean-Marc Valin
4b087df592 Increasing resolution of the alloc trim 2010-11-30 21:08:31 -05:00
Jean-Marc Valin
4f177e8510 Intensity stereo now in the bit-stream
Bands that are intensity-coded also get less bits than the others
2010-11-26 10:32:03 -05:00
Timothy B. Terriberry
ef2e650592 Add coarse energy entropy model tuning.
This tunes the entropy model for coarse energy introduced in commit
 c1c40a76.
It uses a constant set of parameters, tuned from about an hour and a
 half of randomly selected test data encoded for each frame size,
 prediction type (inter/intra), and band number.
These will be slightly sub-optimal for different frame sizes, but
 should be better than what we were using.

For inter, this saves an average of 2.8, 5.2, 7.1, and 6.7 bits/frame
 for frame sizes of 120, 240, 480, and 960, respectively.
For intra, this saves an average of 1.5, 3.0, 4.5, and 5.3 bits/frame
 (for the same frame sizes, respectively).
2010-11-09 17:54:41 +08:00
Jean-Marc Valin
1ad93cf485 Fixes several fixed-point overflows in the PLC code 2010-11-06 22:02:32 -04:00
Jean-Marc Valin
e53c4bc59b Fixes a silly fixed-point scaling PLC bug 2010-11-06 21:41:40 -04:00
Jean-Marc Valin
d7231dd1a9 Giving up on reusing the saved overlap in the PLC 2010-11-06 20:30:17 -04:00
Jean-Marc Valin
bc4a002369 PLC fixes
Fixed an off-by-one in the handling of the IIR filter memory and
disabled "TDAC blending" at the beginning of a lost packet until it
can be made to work properly.
2010-11-06 18:11:06 -04:00
Jean-Marc Valin
6c12497c77 Increases the probability of alloc_trim==2 to reflect the latest changes 2010-11-05 14:55:55 -04:00
Jean-Marc Valin
44a96007b2 Minor tuning 2010-11-05 11:39:50 -04:00
Gregory Maxwell
9743bf38ca Switch iteration over channels to the do{}while(); construct in order to inform the compiler that the these loops execute at least once. (This results in more intelligent output from the clang static analysis tool and should also produce faster code on at least some architectures.) 2010-11-04 23:52:43 -04:00
Gregory Maxwell
60c316b419 Eliminate some promotions to double. A fair number of implicit promotions remain but they all involve math functions which exist only as double precision form in C89. 2010-11-04 23:52:34 -04:00
Jean-Marc Valin
a3a066cb61 Fixes some stereo issues where the right channel wasn't taken into account 2010-11-04 15:15:54 -04:00
Jean-Marc Valin
35095c6991 Squashed commit of the following:
commit a2cc77cb2744a2cb0551b9bfdf06b97457b6d449
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Thu Nov 4 13:11:21 2010 -0400

    Adding a switch to enable the post-filter (off by default)

commit 8e860dc0dfbe57e59fcbd5352588c5edff020e27
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Thu Nov 4 11:57:12 2010 -0400

    Allowing pitches up to 3000 Hz

commit 837412d37bbca32bb34bfb5941e132ff4b0a568c
Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Date:   Wed Nov 3 20:47:11 2010 -0400

    Pitch estimation tuning to prevent some cases of pitch halving

commit 34e20f24c85b40fffd1a15c5b632f2f78b26f081
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Wed Nov 3 16:31:51 2010 -0400

    Resynthesis now purely a compile-time option with RESYNTH

commit d83fb5a9cc2ec4b6cce938662997643da1c5ed0d
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Wed Nov 3 16:28:25 2010 -0400

    Fixes a divide by zero in remove_doubling()

commit bb91e05b7f8f91fd15a8a0daae3d8cb6bd8d81db
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Wed Nov 3 15:55:48 2010 -0400

    Bring back resynthesis with RESYNTH macro

commit 31fe6f6b4997af0a46b8c62f523fe2dfdb7f56ae
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Tue Nov 2 17:55:04 2010 -0400

    Tuning the allocation tilt to give more bits to higher frequencies.

    Especially useful now that the post-filter can reduce low freq noise.

commit 919ba48f0369a87885334756cdfac2a448ce52d0
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Mon Nov 1 17:27:19 2010 -0400

    C89 fix

commit ee0dbb1855a82ee8c132ddaffcab4d072bb3455e
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Mon Nov 1 11:45:10 2010 -0400

    Complete fixed-point port of the pitch code (I think).

commit 4c7b3fd12a8f7469607b5ac57c85301a5de9fa81
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Mon Nov 1 10:55:43 2010 -0400

    More fixed-point pitch gain work

commit 26f1412188900199b63e187fcb0bd04db53c898a
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Mon Nov 1 10:39:25 2010 -0400

    Fixed-point version of the pitch gain calculation code

commit 27c73d008e9f50d282c3ad08e2f05f7006013ae1
Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Date:   Sun Oct 31 16:50:26 2010 -0400

    Some more fixed-point work in remove_doubling()

commit 59354672cb3af794a0e46c0b2097d6441c75cdd1
Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Date:   Sun Oct 31 09:57:36 2010 -0400

    Fixed a stupid fixed-point pf bug in the gain handling

commit be9e7dabf6c8b32bc049da260b58ff6085dc1ac3
Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Date:   Sat Oct 30 01:52:09 2010 -0400

    Fixed-point: fixed frac_div32() that was broken a few commits ago.

commit 5b06270afc41a88915252cea14411be43650e704
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Fri Oct 29 17:45:44 2010 -0400

    This fixes VBR when encoding the pitch period with raw bits

commit 10e0488458ae558aa80d0b30cce70841ad081f73
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Fri Oct 29 16:50:31 2010 -0400

    Pitch period is now encoder with equal probability for each octave (rather than each lag).

    Max pitch gain allowed is now 0.625.

commit ca19396c1c1511c0e208b400efb51384fc7c200d
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Fri Oct 29 16:00:01 2010 -0400

    More fixed-point post-filter work

commit f3e42fde1b575bc587b2557b8b31a6085421a99c
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Fri Oct 29 14:39:23 2010 -0400

    More fixed-point work for the prefilter/postfilter

commit db945132d12b25ff25acc0701b91a1d8a81417d5
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Fri Oct 29 14:14:02 2010 -0400

    Making the pitch estimation work in fixed-point

    Even if there's still lots of float operations left.

commit acb3f96e04802ac4601295f83bef1f32593e261a
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Fri Oct 29 10:57:39 2010 -0400

    Making the PLC code consistent with the prefilter/postfilter

commit 8f64f5974ac846b8c35d0b692e0472f279206cf0
Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Date:   Thu Oct 28 00:33:53 2010 -0400

    More tuning for remove_doubling()

commit 0c08f2ee9dcc135dd222fef30f5ad93e95e0d364
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Wed Oct 27 17:48:02 2010 -0400

    Doing an interpolation step to improve the accuracy of the pitch estimate

    Also increasing the gain slightly.

commit 23d303e992f1fdc3d2668652603ae6311d3b91c5
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Wed Oct 27 16:56:42 2010 -0400

    Implements a fixed 3-tap prefilter/postfilter to make the gain roll off with frequency

commit 881c5928adc1af9eb75c4b68e9eba94ab1d65adc
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Wed Oct 27 14:47:30 2010 -0400

    Partially whitening the down-sampled signal before the pitch search

commit 4a8687deea8587007f14051cb966f6fd748893a1
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Wed Oct 27 14:27:47 2010 -0400

    pitch_search() no longer computes the gain

commit a7f85bb6b10d9c509caec521ca444efb3f27df05
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Wed Oct 27 14:00:53 2010 -0400

    remove_doubling() now works on the down-sampled signal

commit 06cb70e876873f79fed214ebbca35cb4c5057ec8
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Wed Oct 27 11:28:53 2010 -0400

    Simplification to the pitch continuity code

commit 5201927c284a424eb8f21f63d358844b3de8c285
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Wed Oct 27 11:04:02 2010 -0400

    Some more pitch doubling prevention code

commit 7ef63fbe1f78f79e1923bc42e06fbdf1ec28ffd3
Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Date:   Wed Oct 27 06:49:28 2010 -0400

    Minor fix

commit eb37eaab32e7df074a7ddf0ae4781e57f827c4ad
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Tue Oct 26 18:32:25 2010 -0400

    Enforcing some pitch continuity

commit 751ef6edf2ee7721252cedb264bdf9b3f6244a9d
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Tue Oct 26 17:29:47 2010 -0400

    Code for preventing pitch doubling/halving

commit c12647ecb55b645005efbeede91880db72936f8d
Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Date:   Tue Oct 26 00:04:34 2010 -0400

    Finally getting perfect reconstruction when pitch changes

    Post-filter now delays the filter coefs by the overlap so that the pre-filter
    and post-filter are synchronised.

commit f854311d945bb375039a4a4a4fea782b648581f8
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Mon Oct 25 14:59:13 2010 -0400

    Very simple/inefficient signalling of the prefilter period/gain

commit b4e1215432e3d89a29c998639a6d8b07e28c5a2a
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Mon Oct 25 14:09:17 2010 -0400

    using the actual pitch gain

commit e7cd4f07bb073b6955a001e56c0bbf16156f4195
Author: Jean-Marc Valin <jean-marc.valin@octasic.com>
Date:   Mon Oct 25 12:16:11 2010 -0400

    Adding some pitch prediction though side information still isn't coded

commit 77a03aa27c9b6ed2fe80c27a1196b460ccb5079e
Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Date:   Mon Oct 25 00:12:48 2010 -0400

    prefilter implemented as well

commit a3fd81b6ca213d4a9f8ddfa2883fd0e238d64d04
Author: Jean-Marc Valin <jean-marc.valin@usherbrooke.ca>
Date:   Sun Oct 24 01:14:10 2010 -0400

    Implementing Raymond Chen's comb filter idea

    So far, only the post-filter is there.
2010-11-04 13:24:44 -04:00
Jean-Marc Valin
bc2c454886 Fixed the PLC, which had been broken for a while
Oops. The deemphasis was called on the wrong signal!
2010-10-29 09:44:40 -04:00
Gregory Maxwell
fac6c98ce1 Fix crashes with VBR for short duration frames and very low bitrates. This may, however, cause the encoder to violate the rate target at insanely low rates.
This also generally improves VBR behavior by more carefully accounting
for rounding.
2010-10-28 15:41:44 -04:00
Gregory Maxwell
a9411472cd Switch example tools to use VBR and 960 sample frames by default on the basis that if the user doesn't have any particular requirements that they probably want this.
Minor change in the VBR behavior to hot-start with some internal state
parameters which were observed to be quite consistent across bitrates,
framesizes, and content. This also prevents it from completely burning
the reserve capacity on the first frame if its a short.

Also switch some maximum frame sizes to match the OPUS draft maximums.
2010-10-28 10:45:00 -04:00
Jean-Marc Valin
eedb42282a Further simplications to compute_mdcts() 2010-10-24 00:22:45 -04:00
Jean-Marc Valin
933dd833b8 De-interleaves the MDCT input and overlap memory. 2010-10-24 00:08:16 -04:00
Jean-Marc Valin
9037757ceb Tuning the allocation trim 2010-10-22 15:12:01 -04:00
Jean-Marc Valin
c40addcb04 Reworked the allocation trim to be absolute (in bits/sample) rather relative
Also making use of alloc_trim_analysis() again because the effect of
inter-channel correlation on the bitstream is really in terms of absolute
number of bits/samples.
2010-10-22 14:57:07 -04:00
Jean-Marc Valin
0110301daf allocation trim doesn't make sense for stereo after all 2010-10-19 16:40:24 -04:00
Jean-Marc Valin
c5792dee9d First shot at automatically adjusting the "allocation trim" for stereo.
Also fixed a fixed-point breakage.
2010-10-19 14:24:50 -04:00
Jean-Marc Valin
5790fba762 Simplifying transient_analysis() now that we don't care about the time window 2010-10-18 17:28:40 -04:00
Jean-Marc Valin
7a08ddd14e Removing both the transient window and the mdct_weight_shift.
Both ended up causing more harm than good (e.g. violating energy conservation)
and provided little benefit. This also saves ~3 kB code size on x86-86.
2010-10-18 14:55:42 -04:00
Jean-Marc Valin
35fceef3b4 Turning off time-domain window pending decision on what to do with it. 2010-10-18 00:34:32 -04:00
Jean-Marc Valin
e0aa9d185a Removing dead code found by LLVM's static analysis 2010-10-17 16:25:56 -04:00
Jean-Marc Valin
4d2d9fc9e6 Transient detection fix for the case where a transient occurs during the overlap 2010-10-15 14:17:13 -04:00