Merge commit '3d3cf6745e2a5dc9c377244454c3186d75b177fa'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 26 Nov 2012 14:15:02 +0000 (15:15 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 26 Nov 2012 14:15:02 +0000 (15:15 +0100)
* commit '3d3cf6745e2a5dc9c377244454c3186d75b177fa':
  aacdec: use float planar sample format for output

Conflicts:
libavcodec/aacdec.c
libavcodec/aacsbr.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/aac.h
libavcodec/aacdec.c
libavcodec/aacenc.c
libavcodec/aacsbr.c

@@@ -297,21 -298,12 +298,21 @@@ typedef struct AACContext 
      /** @} */
  
      /**
-      * @name Members used for output interleaving
+      * @name Members used for output
       * @{
       */
-     float *output_data[MAX_CHANNELS];                 ///< Points to each element's 'ret' buffer (PCM output).
+     SingleChannelElement *output_element[MAX_CHANNELS]; ///< Points to each SingleChannelElement
      /** @} */
  
 +
 +    /**
 +     * @name Japanese DTV specific extension
 +     * @{
 +     */
 +    int enable_jp_dmono; ///< enable japanese DTV specific 'dual mono'
 +    int dmono_mode;      ///< select the channel to decode in dual mono.
 +    /** @} */
 +
      DECLARE_ALIGNED(32, float, temp)[128];
  
      OutputConfiguration oc[2];
@@@ -149,14 -149,10 +149,14 @@@ static av_cold int che_configure(AACCon
              ff_aac_sbr_ctx_init(ac, &ac->che[type][id]->sbr);
          }
          if (type != TYPE_CCE) {
-             ac->output_data[(*channels)++] = ac->che[type][id]->ch[0].ret;
 +            if (*channels >= MAX_CHANNELS - (type == TYPE_CPE || (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1))) {
 +                av_log(ac->avctx, AV_LOG_ERROR, "Too many channels\n");
 +                return AVERROR_INVALIDDATA;
 +            }
+             ac->output_element[(*channels)++] = &ac->che[type][id]->ch[0];
              if (type == TYPE_CPE ||
                  (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1)) {
-                 ac->output_data[(*channels)++] = ac->che[type][id]->ch[1].ret;
+                 ac->output_element[(*channels)++] = &ac->che[type][id]->ch[1];
              }
          }
      } else {
@@@ -2399,21 -2364,6 +2429,23 @@@ static int parse_adts_frame_header(AACC
                  return -7;
          } else {
              ac->oc[1].m4ac.chan_config = 0;
 +            /**
 +             * dual mono frames in Japanese DTV can have chan_config 0
 +             * WITHOUT specifying PCE.
 +             *  thus, set dual mono as default.
 +             */
++#if 0
 +            if (ac->enable_jp_dmono && ac->oc[0].status == OC_NONE) {
 +                layout_map_tags = 2;
 +                layout_map[0][0] = layout_map[1][0] = TYPE_SCE;
 +                layout_map[0][2] = layout_map[1][2] = AAC_CHANNEL_FRONT;
 +                layout_map[0][1] = 0;
 +                layout_map[1][1] = 1;
 +                if (output_configure(ac, layout_map, layout_map_tags,
 +                                     OC_TRIAL_FRAME))
 +                    return -7;
 +            }
++#endif
          }
          ac->oc[1].m4ac.sample_rate     = hdr_info.sample_rate;
          ac->oc[1].m4ac.sampling_index  = hdr_info.sampling_index;
@@@ -2509,9 -2461,7 +2546,9 @@@ static int aac_decode_frame_int(AVCodec
                         "Not evaluating a further program_config_element as this construct is dubious at best.\n");
                  pop_output_configuration(ac);
              } else {
-                 err = output_configure(ac, layout_map, tags, OC_TRIAL_PCE);
+                 err = output_configure(ac, layout_map, tags, OC_TRIAL_PCE, 1);
 +                if (!err)
 +                    ac->oc[1].m4ac.chan_config = 0;
                  pce_found = 1;
              }
              break;
  
      multiplier = (ac->oc[1].m4ac.sbr == 1) ? ac->oc[1].m4ac.ext_sample_rate > ac->oc[1].m4ac.sample_rate : 0;
      samples <<= multiplier;
--
++#if 0
 +    /* for dual-mono audio (SCE + SCE) */
 +    is_dmono = ac->enable_jp_dmono && sce_count == 2 &&
 +               ac->oc[1].channel_layout == (AV_CH_FRONT_LEFT | AV_CH_FRONT_RIGHT);
 +
 +    if (is_dmono) {
 +        if (ac->dmono_mode == 0) {
 +            tmp = ac->output_data[1];
 +            ac->output_data[1] = ac->output_data[0];
 +        } else if (ac->dmono_mode == 1) {
 +            tmp = ac->output_data[0];
 +            ac->output_data[0] = ac->output_data[1];
 +        }
 +    }
++#endif
      if (samples) {
-         /* get output buffer */
          ac->frame.nb_samples = samples;
-         if ((err = avctx->get_buffer(avctx, &ac->frame)) < 0) {
-             av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
-             err = -1;
-             goto fail;
-         }
-         if (avctx->sample_fmt == AV_SAMPLE_FMT_FLT)
-             ac->fmt_conv.float_interleave((float *)ac->frame.data[0],
-                                           (const float **)ac->output_data,
-                                           samples, avctx->channels);
-         else
-             ac->fmt_conv.float_to_int16_interleave((int16_t *)ac->frame.data[0],
-                                                    (const float **)ac->output_data,
-                                                    samples, avctx->channels);
          *(AVFrame *)data = ac->frame;
      }
      *got_frame_ptr = !!samples;
--
++#if 0
 +    if (is_dmono) {
 +        if (ac->dmono_mode == 0)
 +            ac->output_data[1] = tmp;
 +        else if (ac->dmono_mode == 1)
 +            ac->output_data[0] = tmp;
 +    }
++#endif
      if (ac->oc[1].status && audio_found) {
          avctx->sample_rate = ac->oc[1].m4ac.sample_rate << multiplier;
          avctx->frame_size = samples;
@@@ -191,7 -191,7 +191,7 @@@ WINDOW_FUNC(only_long
  {
      const float *lwindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024;
      const float *pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_sine_1024;
--    float *out = sce->ret;
++    float *out = sce->ret_buf;
  
      fdsp->vector_fmul       (out,        audio,        lwindow, 1024);
      dsp->vector_fmul_reverse(out + 1024, audio + 1024, pwindow, 1024);
@@@ -201,7 -201,7 +201,7 @@@ WINDOW_FUNC(long_start
  {
      const float *lwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_long_1024 : ff_sine_1024;
      const float *swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128;
--    float *out = sce->ret;
++    float *out = sce->ret_buf;
  
      fdsp->vector_fmul(out, audio, lwindow, 1024);
      memcpy(out + 1024, audio + 1024, sizeof(out[0]) * 448);
@@@ -213,7 -213,7 +213,7 @@@ WINDOW_FUNC(long_stop
  {
      const float *lwindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_long_1024 : ff_sine_1024;
      const float *swindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128;
--    float *out = sce->ret;
++    float *out = sce->ret_buf;
  
      memset(out, 0, sizeof(out[0]) * 448);
      fdsp->vector_fmul(out + 448, audio + 448, swindow, 128);
@@@ -226,7 -226,7 +226,7 @@@ WINDOW_FUNC(eight_short
      const float *swindow = sce->ics.use_kb_window[0] ? ff_aac_kbd_short_128 : ff_sine_128;
      const float *pwindow = sce->ics.use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128;
      const float *in = audio + 448;
--    float *out = sce->ret;
++    float *out = sce->ret_buf;
      int w;
  
      for (w = 0; w < 8; w++) {
@@@ -251,7 -251,7 +251,7 @@@ static void apply_window_and_mdct(AACEn
                                    float *audio)
  {
      int i;
--    float *output = sce->ret;
++    float *output = sce->ret_buf;
  
      apply_window[sce->ics.window_sequence[0]](&s->dsp, &s->fdsp, sce, audio);
  
@@@ -142,9 -140,6 +142,8 @@@ static void sbr_turnoff(SpectralBandRep
  
  av_cold void ff_aac_sbr_ctx_init(AACContext *ac, SpectralBandReplication *sbr)
  {
-     float mdct_scale;
 +    if(sbr->mdct.mdct_bits)
 +        return;
      sbr->kx[0] = sbr->kx[1];
      sbr_turnoff(sbr);
      sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);