ffmpeg | branch: master | Rostislav Pehlivanov <atomnu...@gmail.com> | Sat Oct 17 10:55:19 2015 +0100| [f3ad901a32c95239f302f173b866b82fb1f6cdf9] | committer: Rostislav Pehlivanov
aacenc_tns: disable coefficient compression by default Too much effort and work has been spent on such a simple function. It simply refuses to work as the specifications say, the transformation is NOT lossless and creates some crackling and distortions. Therefore disable it by default and add a couple of warnings to scare people away from touching it or wasting their time the way I did. > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f3ad901a32c95239f302f173b866b82fb1f6cdf9 --- libavcodec/aacenc_tns.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/libavcodec/aacenc_tns.c b/libavcodec/aacenc_tns.c index 3d5bfd7..62cf7a0 100644 --- a/libavcodec/aacenc_tns.c +++ b/libavcodec/aacenc_tns.c @@ -31,27 +31,31 @@ #include "aacenc_utils.h" #include "aacenc_quantization.h" -/* - * Shifts the values as well if compression is possible. - */ +/* Define this to save a bit, be warned decoders can't deal with it + * so it is not lossless despite what the specifications say */ +// #define TNS_ENABLE_COEF_COMPRESSION + static inline int compress_coeffs(int *coef, int order, int c_bits) { - int i, res = 0; + int i; const int low_idx = c_bits ? 4 : 2; const int shift_val = c_bits ? 8 : 4; const int high_idx = c_bits ? 11 : 5; +#ifndef TNS_ENABLE_COEF_COMPRESSION + return 0; +#endif /* TNS_ENABLE_COEF_COMPRESSION */ + for (i = 0; i < order; i++) + if (coef[i] >= low_idx && coef[i] <= high_idx) + return 0; for (i = 0; i < order; i++) - if (coef[i] < low_idx || coef[i] > high_idx) - res++; - if (res == order) - for (i = 0; i < order; i++) - coef[i] -= (coef[i] > high_idx) ? shift_val : 0; - return res == order; + coef[i] -= (coef[i] > high_idx) ? shift_val : 0; + return 1; } /** * Encode TNS data. - * Coefficient compression saves a single bit per coefficient. + * Coefficient compression is simply not lossless as it should be + * on any decoder tested and as such is not active. */ void ff_aac_encode_tns_info(AACEncContext *s, SingleChannelElement *sce) { _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog