Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 5 Nov 2012 22:00:23 +0000 (23:00 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 5 Nov 2012 22:01:34 +0000 (23:01 +0100)
* qatar/master:
  FATE: add a 24-bit FLAC encoding test
  FATE: rename FLAC tests from flac-* to flac-16-*
  flacenc: use RICE2 entropy coding mode for 24-bit
  flacenc: add 24-bit encoding
  flacdsp: move lpc encoding from FLAC encoder to FLACDSPContext

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/flacdsp.c
libavcodec/flacdsp.h
libavcodec/flacdsp_lpc_template.c
libavcodec/flacenc.c

Simple merge
Simple merge
index 0000000,269e64b..0c453ae
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,141 +1,141 @@@
 - * This file is part of Libav.
+ /*
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * FFmpeg is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU Lesser General Public
+  * License as published by the Free Software Foundation; either
+  * version 2.1 of the License, or (at your option) any later version.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include <stdint.h>
+ #include "libavutil/avutil.h"
+ #include "mathops.h"
+ #undef FUNC
+ #undef sum_type
+ #undef MUL
+ #undef CLIP
+ #undef FSUF
+ #define FUNC(n) AV_JOIN(n ## _, SAMPLE_SIZE)
+ #if SAMPLE_SIZE == 32
+ #   define sum_type  int64_t
+ #   define MUL(a, b) MUL64(a, b)
+ #   define CLIP(x) av_clipl_int32(x)
+ #else
+ #   define sum_type  int32_t
+ #   define MUL(a, b) ((a) * (b))
+ #   define CLIP(x) (x)
+ #endif
+ #define LPC1(x) {           \
+     int c = coefs[(x)-1];   \
+     p0   += MUL(c, s);      \
+     s     = smp[i-(x)+1];   \
+     p1   += MUL(c, s);      \
+ }
+ static av_always_inline void FUNC(lpc_encode_unrolled)(int32_t *res,
+                                   const int32_t *smp, int len, int order,
+                                   const int32_t *coefs, int shift, int big)
+ {
+     int i;
+     for (i = order; i < len; i += 2) {
+         int s  = smp[i-order];
+         sum_type p0 = 0, p1 = 0;
+         if (big) {
+             switch (order) {
+             case 32: LPC1(32)
+             case 31: LPC1(31)
+             case 30: LPC1(30)
+             case 29: LPC1(29)
+             case 28: LPC1(28)
+             case 27: LPC1(27)
+             case 26: LPC1(26)
+             case 25: LPC1(25)
+             case 24: LPC1(24)
+             case 23: LPC1(23)
+             case 22: LPC1(22)
+             case 21: LPC1(21)
+             case 20: LPC1(20)
+             case 19: LPC1(19)
+             case 18: LPC1(18)
+             case 17: LPC1(17)
+             case 16: LPC1(16)
+             case 15: LPC1(15)
+             case 14: LPC1(14)
+             case 13: LPC1(13)
+             case 12: LPC1(12)
+             case 11: LPC1(11)
+             case 10: LPC1(10)
+             case  9: LPC1( 9)
+                      LPC1( 8)
+                      LPC1( 7)
+                      LPC1( 6)
+                      LPC1( 5)
+                      LPC1( 4)
+                      LPC1( 3)
+                      LPC1( 2)
+                      LPC1( 1)
+             }
+         } else {
+             switch (order) {
+             case  8: LPC1( 8)
+             case  7: LPC1( 7)
+             case  6: LPC1( 6)
+             case  5: LPC1( 5)
+             case  4: LPC1( 4)
+             case  3: LPC1( 3)
+             case  2: LPC1( 2)
+             case  1: LPC1( 1)
+             }
+         }
+         res[i  ] = smp[i  ] - CLIP(p0 >> shift);
+         res[i+1] = smp[i+1] - CLIP(p1 >> shift);
+     }
+ }
+ static void FUNC(flac_lpc_encode_c)(int32_t *res, const int32_t *smp, int len,
+                                     int order, const int32_t *coefs, int shift)
+ {
+     int i;
+     for (i = 0; i < order; i++)
+         res[i] = smp[i];
+ #if CONFIG_SMALL
+     for (i = order; i < len; i += 2) {
+         int j;
+         int s  = smp[i];
+         sum_type p0 = 0, p1 = 0;
+         for (j = 0; j < order; j++) {
+             int c = coefs[j];
+             p1   += MUL(c, s);
+             s     = smp[i-j-1];
+             p0   += MUL(c, s);
+         }
+         res[i  ] = smp[i  ] - CLIP(p0 >> shift);
+         res[i+1] = smp[i+1] - CLIP(p1 >> shift);
+     }
+ #else
+     switch (order) {
+     case  1: FUNC(lpc_encode_unrolled)(res, smp, len,     1, coefs, shift, 0); break;
+     case  2: FUNC(lpc_encode_unrolled)(res, smp, len,     2, coefs, shift, 0); break;
+     case  3: FUNC(lpc_encode_unrolled)(res, smp, len,     3, coefs, shift, 0); break;
+     case  4: FUNC(lpc_encode_unrolled)(res, smp, len,     4, coefs, shift, 0); break;
+     case  5: FUNC(lpc_encode_unrolled)(res, smp, len,     5, coefs, shift, 0); break;
+     case  6: FUNC(lpc_encode_unrolled)(res, smp, len,     6, coefs, shift, 0); break;
+     case  7: FUNC(lpc_encode_unrolled)(res, smp, len,     7, coefs, shift, 0); break;
+     case  8: FUNC(lpc_encode_unrolled)(res, smp, len,     8, coefs, shift, 0); break;
+     default: FUNC(lpc_encode_unrolled)(res, smp, len, order, coefs, shift, 1); break;
+     }
+ #endif
+ }
@@@ -605,10 -622,12 +645,12 @@@ static uint64_t calc_rice_params(RiceCo
      uint32_t *udata;
      uint64_t sums[MAX_PARTITION_ORDER+1][MAX_PARTITIONS];
  
 -    assert(pmin >= 0 && pmin <= MAX_PARTITION_ORDER);
 -    assert(pmax >= 0 && pmax <= MAX_PARTITION_ORDER);
 -    assert(pmin <= pmax);
 +    av_assert1(pmin >= 0 && pmin <= MAX_PARTITION_ORDER);
 +    av_assert1(pmax >= 0 && pmax <= MAX_PARTITION_ORDER);
 +    av_assert1(pmin <= pmax);
  
+     tmp_rc.coding_mode = rc->coding_mode;
      udata = av_malloc(n * sizeof(uint32_t));
      for (i = 0; i < n; i++)
          udata[i] = (2*data[i]) ^ (data[i]>>31);
@@@ -1392,8 -1331,9 +1352,9 @@@ AVCodec ff_flac_encoder = 
      .init           = flac_encode_init,
      .encode2        = flac_encode_frame,
      .close          = flac_encode_close,
 -    .capabilities   = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY,
 +    .capabilities   = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_LOSSLESS,
      .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
+                                                      AV_SAMPLE_FMT_S32,
                                                       AV_SAMPLE_FMT_NONE },
      .long_name      = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
      .priv_class     = &flac_encoder_class,