Merge commit '5d6a990c115850326711c2f5be4d9fd33f399616'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 11 Nov 2013 20:46:35 +0000 (21:46 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 11 Nov 2013 20:46:35 +0000 (21:46 +0100)
* commit '5d6a990c115850326711c2f5be4d9fd33f399616':
  mpegaudioenc: Remove broken integer-only quantization code path

Conflicts:
libavcodec/mpegaudioenc.c

Mostly not merged, the integer code works fine.

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/mpegaudioenc.c

@@@ -2,20 -2,20 +2,20 @@@
   * The simplest mpeg audio layer 2 encoder
   * Copyright (c) 2000, 2001 Fabrice Bellard
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * 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 Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #define FRAC_BITS   15   /* fractional bits for sb_samples and dct */
  #define WFRAC_BITS  14   /* fractional bits for window */
  
++/* define it to use floats in quantization (I don't like floats !) */
++#define USE_FLOATS
++
  #include "mpegaudio.h"
  #include "mpegaudiodsp.h"
+ #include "mpegaudiodata.h"
+ #include "mpegaudiotab.h"
  
  /* currently, cannot change these constants (need to modify
     quantization stage) */
@@@ -61,12 -63,6 +66,6 @@@ typedef struct MpegAudioContext 
      const unsigned char *alloc_table;
  } MpegAudioContext;
  
- /* define it to use floats in quantization (I don't like floats !) */
- #define USE_FLOATS
- #include "mpegaudiodata.h"
- #include "mpegaudiotab.h"
  static av_cold int MPA_encode_init(AVCodecContext *avctx)
  {
      MpegAudioContext *s = avctx->priv_data;
      }
  
      for(i=0;i<64;i++) {
 -        v = (int)(pow(2.0, (3 - i) / 3.0) * (1 << 20));
 +        v = (int)(exp2((3 - i) / 3.0) * (1 << 20));
          if (v <= 0)
              v = 1;
          scale_factor_table[i] = v;
 -        scale_factor_inv_table[i] = pow(2.0, -(3 - i) / 3.0) / (float)(1 << 20);
 +#ifdef USE_FLOATS
 +        scale_factor_inv_table[i] = exp2(-(3 - i) / 3.0) / (float)(1 << 20);
 +#else
 +#define P 15
 +        scale_factor_shift[i] = 21 - P - (i / 3);
 +        scale_factor_mult[i] = (1 << P) * exp2((i % 3) / 3.0);
 +#endif
      }
      for(i=0;i<128;i++) {
          v = i - 64;
@@@ -401,7 -391,7 +400,7 @@@ static void compute_scale_factors(unsig
              av_dlog(NULL, "%2d:%d in=%x %x %d\n",
                      j, i, vmax, scale_factor_table[index], index);
              /* store the scale factor */
 -            assert(index >=0 && index <= 63);
 +            av_assert2(index >=0 && index <= 63);
              sf[i] = index;
          }
  
              sf[1] = sf[2] = sf[0];
              break;
          default:
 -            assert(0); //cannot happen
 +            av_assert2(0); //cannot happen
              code = 0;           /* kill warning */
          }
  
@@@ -583,7 -573,7 +582,7 @@@ static void compute_bit_allocation(Mpeg
          }
      }
      *padding = max_frame_size - current_frame_size;
 -    assert(*padding >= 0);
 +    av_assert0(*padding >= 0);
  }
  
  /*
@@@ -672,33 -662,14 +671,33 @@@ static void encode_frame(MpegAudioConte
                          qindex = s->alloc_table[j+b];
                          steps = ff_mpa_quant_steps[qindex];
                          for(m=0;m<3;m++) {
 -                            float a;
                              sample = s->sb_samples[ch][k][l + m][i];
                              /* divide by scale factor */
 -                            a = (float)sample * scale_factor_inv_table[s->scale_factors[ch][i][k]];
 -                            q[m] = (int)((a + 1.0) * steps * 0.5);
 +#ifdef USE_FLOATS
 +                            {
 +                                float a;
 +                                a = (float)sample * scale_factor_inv_table[s->scale_factors[ch][i][k]];
 +                                q[m] = (int)((a + 1.0) * steps * 0.5);
 +                            }
 +#else
 +                            {
 +                                int q1, e, shift, mult;
 +                                e = s->scale_factors[ch][i][k];
 +                                shift = scale_factor_shift[e];
 +                                mult = scale_factor_mult[e];
 +
 +                                /* normalize to P bits */
 +                                if (shift < 0)
 +                                    q1 = sample << (-shift);
 +                                else
 +                                    q1 = sample >> shift;
 +                                q1 = (q1 * mult) >> P;
 +                                q[m] = ((q1 + (1 << P)) * steps) >> (P + 1);
 +                            }
 +#endif
                              if (q[m] >= steps)
                                  q[m] = steps - 1;
 -                            assert(q[m] >= 0 && q[m] < steps);
 +                            av_assert2(q[m] >= 0 && q[m] < steps);
                          }
                          bits = ff_mpa_quant_bits[qindex];
                          if (bits < 0) {
@@@ -748,8 -719,10 +747,8 @@@ static int MPA_encode_frame(AVCodecCont
      }
      compute_bit_allocation(s, smr, bit_alloc, &padding);
  
 -    if ((ret = ff_alloc_packet(avpkt, MPA_MAX_CODED_FRAME_SIZE))) {
 -        av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
 +    if ((ret = ff_alloc_packet2(avctx, avpkt, MPA_MAX_CODED_FRAME_SIZE)) < 0)
          return ret;
 -    }
  
      init_put_bits(&s->pb, avpkt->data, avpkt->size);