OSDN Git Service

aacenc_tns: disable coefficient compression by default
authorRostislav Pehlivanov <atomnuker@gmail.com>
Sat, 17 Oct 2015 09:55:19 +0000 (10:55 +0100)
committerRostislav Pehlivanov <atomnuker@gmail.com>
Sat, 17 Oct 2015 10:10:26 +0000 (11:10 +0100)
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.

libavcodec/aacenc_tns.c

index 3d5bfd7..62cf7a0 100644 (file)
 #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)
 {