Merge commit '14f031d7ecfabba0ef02776d4516aa3dcb7c40d8'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 30 Oct 2012 13:40:22 +0000 (14:40 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 30 Oct 2012 13:40:22 +0000 (14:40 +0100)
* commit '14f031d7ecfabba0ef02776d4516aa3dcb7c40d8':
  dv: use AVStream.index instead of abusing AVStream.id
  lavfi: add ashowinfo filter
  avcodec: Add a RFC 3389 comfort noise codec
  lpc: Add a function for calculating reflection coefficients from samples
  lpc: Add a function for calculating reflection coefficients from autocorrelation coefficients
  lavr: document upper bound on number of output samples.
  lavr: add general API usage doxy
  indeo3: remove duplicate capabilities line.
  fate: ac3: Add dependencies

Conflicts:
Changelog
doc/filters.texi
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/avcodec.h
libavcodec/codec_desc.c
libavcodec/version.h
libavfilter/Makefile
libavfilter/af_ashowinfo.c
libavfilter/allfilters.c
libavfilter/version.h
libavutil/avutil.h

Merged-by: Michael Niedermayer <michaelni@gmx.at>
16 files changed:
1  2 
configure
doc/filters.texi
libavcodec/Makefile
libavcodec/allcodecs.c
libavcodec/avcodec.h
libavcodec/cngdec.c
libavcodec/cngenc.c
libavcodec/codec_desc.c
libavcodec/lpc.c
libavcodec/lpc.h
libavcodec/version.h
libavfilter/af_ashowinfo.c
libavfilter/version.h
libavformat/dv.c
libavutil/avutil.h
tests/fate/ac3.mak

diff --cc configure
Simple merge
@@@ -414,26 -190,17 +414,21 @@@ A description of each shown parameter f
  sequential number of the input frame, starting from 0
  
  @item pts
- presentation TimeStamp of the input frame, expressed as a number of
- time base units. The time base unit depends on the filter input pad, and
- is usually 1/@var{sample_rate}.
+ Presentation timestamp of the input frame, in time base units; the time base
+ depends on the filter input pad, and is usually 1/@var{sample_rate}.
  
  @item pts_time
- presentation TimeStamp of the input frame, expressed as a number of
- seconds
+ presentation timestamp of the input frame in seconds
  
 +@item pos
 +position of the frame in the input stream, -1 if this information in
 +unavailable and/or meaningless (for example in case of synthetic audio)
 +
  @item fmt
- sample format name
+ sample format
  
  @item chlayout
- channel layout description
- @item nb_samples
- number of samples (per each channel) contained in the filtered frame
+ channel layout
  
  @item rate
  sample rate for the audio frame
@@@ -145,7 -129,8 +145,9 @@@ OBJS-$(CONFIG_CLJR_DECODER)            
  OBJS-$(CONFIG_CLJR_ENCODER)            += cljr.o
  OBJS-$(CONFIG_CLLC_DECODER)            += cllc.o
  OBJS-$(CONFIG_COOK_DECODER)            += cook.o
+ OBJS-$(CONFIG_COMFORTNOISE_DECODER)    += cngdec.o celp_filters.o
+ OBJS-$(CONFIG_COMFORTNOISE_ENCODER)    += cngenc.o
 +OBJS-$(CONFIG_CPIA_DECODER)            += cpia.o
  OBJS-$(CONFIG_CSCD_DECODER)            += cscd.o
  OBJS-$(CONFIG_CYUV_DECODER)            += cyuv.o
  OBJS-$(CONFIG_DCA_DECODER)             += dcadec.o dca.o dcadsp.o      \
@@@ -97,7 -91,7 +97,8 @@@ void avcodec_register_all(void
      REGISTER_DECODER (CINEPAK, cinepak);
      REGISTER_ENCDEC  (CLJR, cljr);
      REGISTER_DECODER (CLLC, cllc);
+     REGISTER_ENCDEC  (COMFORTNOISE, comfortnoise);
 +    REGISTER_DECODER (CPIA, cpia);
      REGISTER_DECODER (CSCD, cscd);
      REGISTER_DECODER (CYUV, cyuv);
      REGISTER_DECODER (DFA, dfa);
@@@ -425,14 -405,8 +425,15 @@@ enum AVCodecID 
      AV_CODEC_ID_RALF,
      AV_CODEC_ID_IAC,
      AV_CODEC_ID_ILBC,
 -    AV_CODEC_ID_OPUS,
 +    AV_CODEC_ID_OPUS_DEPRECATED,
+     AV_CODEC_ID_COMFORT_NOISE,
 +    AV_CODEC_ID_FFWAVESYNTH = MKBETAG('F','F','W','S'),
 +    AV_CODEC_ID_8SVX_RAW    = MKBETAG('8','S','V','X'),
 +    AV_CODEC_ID_SONIC       = MKBETAG('S','O','N','C'),
 +    AV_CODEC_ID_SONIC_LS    = MKBETAG('S','O','N','L'),
 +    AV_CODEC_ID_PAF_AUDIO   = MKBETAG('P','A','F','A'),
 +    AV_CODEC_ID_OPUS        = MKBETAG('O','P','U','S'),
 +    AV_CODEC_ID_TAK         = MKBETAG('t','B','a','K'),
  
      /* subtitle codecs */
      AV_CODEC_ID_FIRST_SUBTITLE = 0x17000,          ///< A dummy ID pointing at the start of subtitle codecs.
index 0000000,c22fd55..0daeb9b
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,162 +1,162 @@@
 - * This file is part of Libav.
+ /*
+  * RFC 3389 comfort noise generator
+  * Copyright (c) 2012 Martin Storsjo
+  *
 - * 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 <math.h>
+ #include "libavutil/common.h"
+ #include "avcodec.h"
+ #include "celp_filters.h"
+ #include "libavutil/lfg.h"
+ typedef struct CNGContext {
+     AVFrame avframe;
+     float *refl_coef, *target_refl_coef;
+     float *lpc_coef;
+     int order;
+     int energy, target_energy;
+     float *filter_out;
+     float *excitation;
+     AVLFG lfg;
+ } CNGContext;
+ static av_cold int cng_decode_close(AVCodecContext *avctx)
+ {
+     CNGContext *p = avctx->priv_data;
+     av_free(p->refl_coef);
+     av_free(p->target_refl_coef);
+     av_free(p->lpc_coef);
+     av_free(p->filter_out);
+     av_free(p->excitation);
+     return 0;
+ }
+ static av_cold int cng_decode_init(AVCodecContext *avctx)
+ {
+     CNGContext *p = avctx->priv_data;
+     avctx->sample_fmt  = AV_SAMPLE_FMT_S16;
+     avctx->channels    = 1;
+     avctx->sample_rate = 8000;
+     avcodec_get_frame_defaults(&p->avframe);
+     avctx->coded_frame  = &p->avframe;
+     p->order            = 12;
+     avctx->frame_size   = 640;
+     p->refl_coef        = av_mallocz(p->order * sizeof(*p->refl_coef));
+     p->target_refl_coef = av_mallocz(p->order * sizeof(*p->target_refl_coef));
+     p->lpc_coef         = av_mallocz(p->order * sizeof(*p->lpc_coef));
+     p->filter_out       = av_mallocz((avctx->frame_size + p->order) *
+                                      sizeof(*p->filter_out));
+     p->excitation       = av_mallocz(avctx->frame_size * sizeof(*p->excitation));
+     if (!p->refl_coef || !p->target_refl_coef || !p->lpc_coef ||
+         !p->filter_out || !p->excitation) {
+         cng_decode_close(avctx);
+         return AVERROR(ENOMEM);
+     }
+     av_lfg_init(&p->lfg, 0);
+     return 0;
+ }
+ static void make_lpc_coefs(float *lpc, const float *refl, int order)
+ {
+     float buf[100];
+     float *next, *cur;
+     int m, i;
+     next = buf;
+     cur  = lpc;
+     for (m = 0; m < order; m++) {
+         next[m] = refl[m];
+         for (i = 0; i < m; i++)
+             next[i] = cur[i] + refl[m] * cur[m - i - 1];
+         FFSWAP(float*, next, cur);
+     }
+     if (cur != lpc)
+         memcpy(lpc, cur, sizeof(*lpc) * order);
+ }
+ static int cng_decode_frame(AVCodecContext *avctx, void *data,
+                               int *got_frame_ptr, AVPacket *avpkt)
+ {
+     CNGContext *p = avctx->priv_data;
+     int buf_size  = avpkt->size;
+     int ret, i;
+     int16_t *buf_out;
+     float e = 1.0;
+     float scaling;
+     if (avpkt->size) {
+         float dbov = -avpkt->data[0] / 10.0;
+         p->target_energy = 1081109975 * pow(10, dbov) * 0.75;
+         memset(p->target_refl_coef, 0, sizeof(p->refl_coef));
+         for (i = 0; i < FFMIN(avpkt->size - 1, p->order); i++) {
+             p->target_refl_coef[i] = (avpkt->data[1 + i] - 127) / 128.0;
+         }
+         make_lpc_coefs(p->lpc_coef, p->refl_coef, p->order);
+     }
+     p->energy = p->energy / 2 + p->target_energy / 2;
+     for (i = 0; i < p->order; i++)
+         p->refl_coef[i] = 0.6 *p->refl_coef[i] + 0.4 * p->target_refl_coef[i];
+     for (i = 0; i < p->order; i++)
+         e *= 1.0 - p->refl_coef[i]*p->refl_coef[i];
+     scaling = sqrt(e * p->energy / 1081109975);
+     for (i = 0; i < avctx->frame_size; i++) {
+         int r = (av_lfg_get(&p->lfg) & 0xffff) - 0x8000;
+         p->excitation[i] = scaling * r;
+     }
+     ff_celp_lp_synthesis_filterf(p->filter_out + p->order, p->lpc_coef,
+                                  p->excitation, avctx->frame_size, p->order);
+     p->avframe.nb_samples = avctx->frame_size;
+     if ((ret = avctx->get_buffer(avctx, &p->avframe)) < 0) {
+         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
+         return ret;
+     }
+     buf_out = (int16_t *)p->avframe.data[0];
+     for (i = 0; i < avctx->frame_size; i++)
+         buf_out[i] = p->filter_out[i + p->order];
+     memcpy(p->filter_out, p->filter_out + avctx->frame_size,
+            p->order * sizeof(*p->filter_out));
+     *got_frame_ptr   = 1;
+     *(AVFrame *)data = p->avframe;
+     return buf_size;
+ }
+ AVCodec ff_comfortnoise_decoder = {
+     .name           = "comfortnoise",
+     .type           = AVMEDIA_TYPE_AUDIO,
+     .id             = AV_CODEC_ID_COMFORT_NOISE,
+     .priv_data_size = sizeof(CNGContext),
+     .init           = cng_decode_init,
+     .decode         = cng_decode_frame,
+     .close          = cng_decode_close,
+     .long_name      = NULL_IF_CONFIG_SMALL("RFC 3389 comfort noise generator"),
+     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
+                                                      AV_SAMPLE_FMT_NONE },
+     .capabilities   = CODEC_CAP_DELAY | CODEC_CAP_DR1,
+ };
index 0000000,1e3f8f0..a1dcfa6
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,116 +1,116 @@@
 - * This file is part of Libav.
+ /*
+  * RFC 3389 comfort noise generator
+  * Copyright (c) 2012 Martin Storsjo
+  *
 - * 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 <math.h>
+ #include "libavutil/common.h"
+ #include "avcodec.h"
+ #include "internal.h"
+ #include "lpc.h"
+ typedef struct CNGContext {
+     LPCContext lpc;
+     int order;
+     int32_t *samples32;
+     double *ref_coef;
+ } CNGContext;
+ static av_cold int cng_encode_close(AVCodecContext *avctx)
+ {
+     CNGContext *p = avctx->priv_data;
+     ff_lpc_end(&p->lpc);
+     av_free(p->samples32);
+     av_free(p->ref_coef);
+     return 0;
+ }
+ static av_cold int cng_encode_init(AVCodecContext *avctx)
+ {
+     CNGContext *p = avctx->priv_data;
+     int ret;
+     if (avctx->channels != 1) {
+         av_log(avctx, AV_LOG_ERROR, "Only mono supported\n");
+         return AVERROR(EINVAL);
+     }
+     avctx->frame_size = 640;
+     p->order = 10;
+     if ((ret = ff_lpc_init(&p->lpc, avctx->frame_size, p->order, FF_LPC_TYPE_LEVINSON)) < 0)
+         return ret;
+     p->samples32 = av_malloc(avctx->frame_size * sizeof(*p->samples32));
+     p->ref_coef = av_malloc(p->order * sizeof(*p->ref_coef));
+     if (!p->samples32 || !p->ref_coef) {
+         cng_encode_close(avctx);
+         return AVERROR(ENOMEM);
+     }
+     return 0;
+ }
+ static int cng_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
+                              const AVFrame *frame, int *got_packet_ptr)
+ {
+     CNGContext *p = avctx->priv_data;
+     int ret, i;
+     double energy = 0;
+     int qdbov;
+     int16_t *samples = (int16_t*) frame->data[0];
+     if ((ret = ff_alloc_packet(avpkt, 1 + p->order))) {
+         av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
+         return ret;
+     }
+     for (i = 0; i < frame->nb_samples; i++) {
+         p->samples32[i] = samples[i];
+         energy += samples[i] * samples[i];
+     }
+     energy /= frame->nb_samples;
+     if (energy > 0) {
+         double dbov = 10 * log10(energy / 1081109975);
+         qdbov = av_clip(-floor(dbov), 0, 127);
+     } else {
+         qdbov = 127;
+     }
+     ret = ff_lpc_calc_ref_coefs(&p->lpc, p->samples32, p->order, p->ref_coef);
+     avpkt->data[0] = qdbov;
+     for (i = 0; i < p->order; i++)
+         avpkt->data[1 + i] = p->ref_coef[i] * 127 + 127;
+     *got_packet_ptr = 1;
+     avpkt->size = 1 + p->order;
+     return 0;
+ }
+ AVCodec ff_comfortnoise_encoder = {
+     .name           = "comfortnoise",
+     .type           = AVMEDIA_TYPE_AUDIO,
+     .id             = AV_CODEC_ID_COMFORT_NOISE,
+     .priv_data_size = sizeof(CNGContext),
+     .init           = cng_encode_init,
+     .encode2        = cng_encode_frame,
+     .close          = cng_encode_close,
+     .long_name      = NULL_IF_CONFIG_SMALL("RFC 3389 comfort noise generator"),
+     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
+                                                      AV_SAMPLE_FMT_NONE },
+ };
@@@ -2264,13 -2112,13 +2264,20 @@@ static const AVCodecDescriptor codec_de
          .long_name = NULL_IF_CONFIG_SMALL("Opus (Opus Interactive Audio Codec)"),
          .props     = AV_CODEC_PROP_LOSSY,
      },
+     {
+         .id        = AV_CODEC_ID_COMFORT_NOISE,
+         .type      = AVMEDIA_TYPE_AUDIO,
+         .name      = "comfortnoise",
+         .long_name = NULL_IF_CONFIG_SMALL("RFC 3389 Comfort Noise"),
+         .props     = AV_CODEC_PROP_LOSSY,
+     },
 +    {
 +        .id        = AV_CODEC_ID_TAK,
 +        .type      = AVMEDIA_TYPE_AUDIO,
 +        .name      = "tak",
 +        .long_name = NULL_IF_CONFIG_SMALL("TAK (Tom's lossless Audio Kompressor)"),
 +        .props     = AV_CODEC_PROP_LOSSLESS,
 +    },
  
      /* subtitle codecs */
      {
Simple merge
Simple merge
   * Libavcodec version macros.
   */
  
 +#include "libavutil/avutil.h"
 +
  #define LIBAVCODEC_VERSION_MAJOR 54
- #define LIBAVCODEC_VERSION_MINOR 69
 -#define LIBAVCODEC_VERSION_MINOR 32
 -#define LIBAVCODEC_VERSION_MICRO  0
++#define LIBAVCODEC_VERSION_MINOR 70
 +#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
   * filter for showing textual audio frame information
   */
  
+ #include <inttypes.h>
+ #include <stddef.h>
  #include "libavutil/adler32.h"
  #include "libavutil/audioconvert.h"
+ #include "libavutil/common.h"
+ #include "libavutil/mem.h"
 +#include "libavutil/timestamp.h"
+ #include "libavutil/samplefmt.h"
  #include "audio.h"
  #include "avfilter.h"
  
@@@ -62,30 -86,46 +87,48 @@@ static int filter_samples(AVFilterLink 
      }
  
      av_get_channel_layout_string(chlayout_str, sizeof(chlayout_str), -1,
-                                  samplesref->audio->channel_layout);
+                                  buf->audio->channel_layout);
  
      av_log(ctx, AV_LOG_INFO,
-            "n:%d pts:%s pts_time:%s pos:%"PRId64" "
-            "fmt:%s chlayout:%s nb_samples:%d rate:%d "
-            "checksum:%08X plane_checksum[%08X",
-            showinfo->frame,
-            av_ts2str(samplesref->pts), av_ts2timestr(samplesref->pts, &inlink->time_base),
-            samplesref->pos,
-            av_get_sample_fmt_name(samplesref->format),
-            chlayout_str,
-            samplesref->audio->nb_samples,
-            samplesref->audio->sample_rate,
-            checksum,
-            plane_checksum[0]);
-     for (plane = 1; plane < 8 && samplesref->data[plane]; plane++)
-         av_log(ctx, AV_LOG_INFO, " %08X", plane_checksum[plane]);
 -           "n:%"PRIu64" pts:%"PRId64" pts_time:%f "
++           "n:%"PRIu64" pts:%s pts_time:%s pos:%"PRId64" "
+            "fmt:%s chlayout:%s rate:%d nb_samples:%d "
+            "checksum:%08X ",
 -           s->frame, buf->pts, buf->pts * av_q2d(inlink->time_base),
++           s->frame,
++           av_ts2str(buf->pts), av_ts2timestr(buf->pts, &inlink->time_base),
++           buf->pos,
+            av_get_sample_fmt_name(buf->format), chlayout_str,
+            buf->audio->sample_rate, buf->audio->nb_samples,
+            checksum);
+     av_log(ctx, AV_LOG_INFO, "plane_checksums: [ ");
+     for (i = 0; i < planes; i++)
+         av_log(ctx, AV_LOG_INFO, "%08X ", s->plane_checksums[i]);
      av_log(ctx, AV_LOG_INFO, "]\n");
  
-     showinfo->frame++;
-     return ff_filter_samples(inlink->dst->outputs[0], samplesref);
+     s->frame++;
+     return ff_filter_samples(inlink->dst->outputs[0], buf);
  }
  
+ static const AVFilterPad inputs[] = {
+     {
+         .name       = "default",
+         .type             = AVMEDIA_TYPE_AUDIO,
+         .get_audio_buffer = ff_null_get_audio_buffer,
+         .config_props     = config_input,
+         .filter_samples   = filter_samples,
+         .min_perms        = AV_PERM_READ,
+     },
+     { NULL },
+ };
+ static const AVFilterPad outputs[] = {
+     {
+         .name = "default",
+         .type = AVMEDIA_TYPE_AUDIO,
+     },
+     { NULL },
+ };
  AVFilter avfilter_af_ashowinfo = {
      .name        = "ashowinfo",
      .description = NULL_IF_CONFIG_SMALL("Show textual information for each audio frame."),
@@@ -29,8 -29,8 +29,8 @@@
  #include "libavutil/avutil.h"
  
  #define LIBAVFILTER_VERSION_MAJOR  3
 -#define LIBAVFILTER_VERSION_MINOR  2
 -#define LIBAVFILTER_VERSION_MICRO  0
 +#define LIBAVFILTER_VERSION_MINOR  20
- #define LIBAVFILTER_VERSION_MICRO 109
++#define LIBAVFILTER_VERSION_MICRO 110
  
  #define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
                                                 LIBAVFILTER_VERSION_MINOR, \
@@@ -388,10 -370,9 +388,10 @@@ int avpriv_dv_produce_packet(DVDemuxCon
      size = dv_extract_video_info(c, buf);
      av_init_packet(pkt);
      pkt->data         = buf;
 +    pkt->pos          = pos;
      pkt->size         = size;
      pkt->flags       |= AV_PKT_FLAG_KEY;
-     pkt->stream_index = c->vst->id;
+     pkt->stream_index = c->vst->index;
      pkt->pts          = c->frames;
  
      c->frames++;
@@@ -39,7 -39,7 +39,8 @@@
   * @li @ref libavf "libavformat" I/O and muxing/demuxing library
   * @li @ref lavd "libavdevice" special devices muxing/demuxing library
   * @li @ref lavu "libavutil" common utility library
 - * @li @ref lavr "libavresample" audio resampling, format conversion and mixing
++ * @li @ref libswresample "libswresample" audio resampling, format conversion and mixing
 + * @li @subpage libpostproc post processing library
   * @li @subpage libswscale  color conversion and scaling library
   */
  
@@@ -49,9 -52,9 +52,9 @@@ fate-ac3-encode: CMD = enc_dec_pcm ac3 
  fate-ac3-encode: CMP_SHIFT = -1024
  fate-ac3-encode: CMP_TARGET = 399.62
  fate-ac3-encode: SIZE_TOLERANCE = 488
 -fate-ac3-encode: FUZZ = 3
 +fate-ac3-encode: FUZZ = 4
  
- FATE_EAC3_ENCODE += fate-eac3-encode
+ FATE_EAC3-$(call ENCDEC, EAC3, EAC3) += fate-eac3-encode
  fate-eac3-encode: CMD = enc_dec_pcm eac3 wav s16le $(REF) -c:a eac3 -b:a 128k
  fate-eac3-encode: CMP_SHIFT = -1024
  fate-eac3-encode: CMP_TARGET = 514.02
@@@ -61,10 -64,10 +64,10 @@@ fate-eac3-encode: FUZZ = 
  fate-ac3-encode fate-eac3-encode: CMP = stddev
  fate-ac3-encode fate-eac3-encode: REF = $(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav
  
- FATE_AC3_FIXED_ENCODE += fate-ac3-fixed-encode
+ FATE_AC3-$(call ENCMUX, AC3_FIXED, AC3) += fate-ac3-fixed-encode
  fate-ac3-fixed-encode: tests/data/asynth-44100-2.wav
  fate-ac3-fixed-encode: SRC = $(TARGET_PATH)/tests/data/asynth-44100-2.wav
 -fate-ac3-fixed-encode: CMD = md5 -i $(SRC) -c ac3_fixed -b 128k -f ac3 -flags bitexact
 +fate-ac3-fixed-encode: CMD = md5 -i $(SRC) -c ac3_fixed -ab 128k -f ac3 -flags +bitexact
  fate-ac3-fixed-encode: CMP = oneline
  fate-ac3-fixed-encode: REF = a1d1fc116463b771abf5aef7ed37d7b1