Age | Commit message (Collapse) | Author |
|
|
|
|
|
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.
|
|
|
|
The old constructor is renamed celt_encoder_create_custom(). Same
for the decoder.
|
|
|
|
|
|
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.
|
|
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.
|
|
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.
|
|
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).
|
|
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).
|
|
sizes and sample rates.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Also dropped support for radices above 5.
|
|
|
|
|
|
The main encode call no longer takes a pointer for the optional resynthesis.
It's now done with a call to celt_encode_resynthesis().
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Accuracy for rsqrt, rcp, cos, and log2 is now at the level of truncation error
for the current output resolution of these functions.
sqrt and exp2 still have non-trivial algebraic error, but this cannot be
reduced much further using the current method without additional computation.
Also updates the fast float approximations for log2 and exp2 with coefficients
that give slightly lower maximum relative error.
Patch modified by Jean-Marc Valin to leave the cos approximation as is and
leave the check for x<-15 in exp2 as is.
|
|
|
|
by POSIX. The other _t types that are not part of the API are still there
for now. Also, got rid of all that was left of the 64-bit types.
|
|
creating the mode. This means that the same mode can be shared for mono and
stereo.
|
|
|
|
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
|
|
|
|
|
|
|
|
"tandem-test" which tests the encoder and decoder in
many modes.
|
|
Adds specialized O(N*log(K)) versions of cwrsi() and O(N) versions of icwrs()
for N={3,4,5}, which allows them to operate all the way up to the theoretical
pulse limit without serious performance degredation.
Also substantially reduces the computation time and stack usage of
get_required_bits().
On x86-64, this gives a 2% speed-up for 256 sample frames, and almost a 16%
speed-up for 64 sample frames.
|
|
problems when building shared libraries only.
|
|
don't use.
When I removed the special case for EC_ILOG(0) in commit
06390d082dcdfa8addb3dde337543bc0f0ebae44, it broke ec_dec_uint() with _ft=1
(which should encode the value 0 using 0 bits).
This feature was tested by ectest.c, but not actually used by libcelt.
An assert has been added to ec_dec_uint() to ensure that we don't try to use
this feature by accident.
ec_enc_uint() was actually correct, but support for this feature has been
removed and the assert put in its place.
|
|
|
|
|
|
Conflicts:
libcelt/cwrs.c
tests/cwrs32-test.c
|
|
It is no slower with a large number of pulses, and as much as 30% faster with
a large number of dimensions.
|
|
|
|
Conflicts:
libcelt/cwrs.c
|
|
This lets us encode and decode directly from the pulse vector without an
intermediate transformation.
This makes old streams undecodable.
Additionally, ncwrs_u32() has been sped up for large N by using the sliding
recurrence from Mohorko et al.
ncwrs_u64 could be sped up in a similar manner, but would require a larger
table of multiplicative inverses (or several 32x32->64 bit multiplies).
Note that U(N,M) is now everywhere 1/2 the value it used to be.
|