[FFmpeg-cvslog] aacenc_tns: disable coefficient compression by default
Rostislav Pehlivanov
git at videolan.org
Sat Oct 17 12:10:57 CEST 2015
ffmpeg | branch: master | Rostislav Pehlivanov <atomnuker at 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)
{
More information about the ffmpeg-cvslog
mailing list