Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 11 Jul 2013 09:50:10 +0000 (11:50 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 11 Jul 2013 09:50:18 +0000 (11:50 +0200)
* qatar/master:
  wmavoice: conceal clearly corrupted blocks

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

diff --combined libavcodec/wmavoice.c
@@@ -2,20 -2,20 +2,20 @@@
   * Windows Media Audio Voice decoder.
   * Copyright (c) 2009 Ronald S. Bultje
   *
 - * 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
   */
  
@@@ -25,6 -25,8 +25,6 @@@
   * @author Ronald S. Bultje <rsbultje@gmail.com>
   */
  
 -#define UNCHECKED_BITSTREAM_READER 1
 -
  #include <math.h>
  
  #include "libavutil/channel_layout.h"
@@@ -518,7 -520,7 +518,7 @@@ static int kalman_smoothen(WMAVoiceCont
      float optimal_gain = 0, dot;
      const float *ptr = &in[-FFMAX(s->min_pitch_val, pitch - 3)],
                  *end = &in[-FFMIN(s->max_pitch_val, pitch + 3)],
 -                *best_hist_ptr;
 +                *best_hist_ptr = NULL;
  
      /* find best fitting point in history */
      do {
@@@ -778,7 -780,7 +778,7 @@@ static void postfilter(WMAVoiceContext 
            *synth_pf = &s->synth_filter_out_buf[MAX_LSPS_ALIGN16],
            *synth_filter_in = zero_exc_pf;
  
 -    assert(size <= MAX_FRAMESIZE / 2);
 +    av_assert0(size <= MAX_FRAMESIZE / 2);
  
      /* generate excitation from input signal */
      ff_celp_lp_zero_synthesis_filterf(zero_exc_pf, lpcs, synth, size, s->lsps);
@@@ -1050,9 -1052,10 +1050,10 @@@ static void aw_parse_coords(WMAVoiceCon
   * @param gb bit I/O context
   * @param block_idx block index in frame [0, 1]
   * @param fcb structure containing fixed codebook vector info
+  * @return -1 on error, 0 otherwise
   */
- static void aw_pulse_set2(WMAVoiceContext *s, GetBitContext *gb,
-                           int block_idx, AMRFixed *fcb)
+ static int aw_pulse_set2(WMAVoiceContext *s, GetBitContext *gb,
+                          int block_idx, AMRFixed *fcb)
  {
      uint16_t use_mask_mem[9]; // only 5 are used, rest is padding
      uint16_t *use_mask = use_mask_mem + 2;
              else if (use_mask[2]) idx = 0x2F;
              else if (use_mask[3]) idx = 0x3F;
              else if (use_mask[4]) idx = 0x4F;
-             else                  return;
+             else return -1;
              idx -= av_log2_16bit(use_mask[idx >> 4]);
          }
          if (use_mask[idx >> 4] & (0x8000 >> (idx & 15))) {
      /* set offset for next block, relative to start of that block */
      n = (MAX_FRAMESIZE / 2 - start_off) % fcb->pitch_lag;
      s->aw_next_pulse_off_cache = n ? fcb->pitch_lag - n : 0;
+     return 0;
  }
  
  /**
@@@ -1245,7 -1249,7 +1247,7 @@@ static void synth_block_hardcoded(WMAVo
      float gain;
      int n, r_idx;
  
 -    assert(size <= MAX_FRAMESIZE);
 +    av_assert0(size <= MAX_FRAMESIZE);
  
      /* Set the offset from which we start reading wmavoice_std_codebook */
      if (frame_desc->fcb_type == FCB_TYPE_SILENCE) {
@@@ -1281,7 -1285,7 +1283,7 @@@ static void synth_block_fcb_acb(WMAVoic
      int n, idx, gain_weight;
      AMRFixed fcb;
  
 -    assert(size <= MAX_FRAMESIZE / 2);
 +    av_assert0(size <= MAX_FRAMESIZE / 2);
      memset(pulses, 0, sizeof(*pulses) * size);
  
      fcb.pitch_lag      = block_pitch_sh2 >> 2;
       * (fixed) codebook pulses of the speech signal. */
      if (frame_desc->fcb_type == FCB_TYPE_AW_PULSES) {
          aw_pulse_set1(s, gb, block_idx, &fcb);
-         aw_pulse_set2(s, gb, block_idx, &fcb);
+         if (aw_pulse_set2(s, gb, block_idx, &fcb)) {
+             /* Conceal the block with silence and return.
+              * Skip the correct amount of bits to read the next
+              * block from the correct offset. */
+             int r_idx = pRNG(s->frame_cntr, block_idx, size);
+             for (n = 0; n < size; n++)
+                 excitation[n] =
+                     wmavoice_std_codebook[r_idx + n] * s->silence_gain;
+             skip_bits(gb, 7 + 1);
+             return;
+         }
      } else /* FCB_TYPE_EXC_PULSES */ {
          int offset_nbits = 5 - frame_desc->log_n_blocks;
  
@@@ -1441,8 -1456,8 +1454,8 @@@ static int synth_frame(AVCodecContext *
                         float *excitation, float *synth)
  {
      WMAVoiceContext *s = ctx->priv_data;
 -    int n, n_blocks_x2, log_n_blocks_x2, cur_pitch_val;
 -    int pitch[MAX_BLOCKS], last_block_pitch;
 +    int n, n_blocks_x2, log_n_blocks_x2, av_uninit(cur_pitch_val);
 +    int pitch[MAX_BLOCKS], av_uninit(last_block_pitch);
  
      /* Parse frame type ("frame header"), see frame_descs */
      int bd_idx = s->vbm_tree[get_vlc2(gb, frame_type_vlc.table, 6, 3)], block_nsamples;
@@@ -1659,7 -1674,7 +1672,7 @@@ static int check_bits_for_superframe(Ge
      /* initialize a copy */
      init_get_bits(gb, orig_gb->buffer, orig_gb->size_in_bits);
      skip_bits_long(gb, get_bits_count(orig_gb));
 -    assert(get_bits_left(gb) == get_bits_left(orig_gb));
 +    av_assert1(get_bits_left(gb) == get_bits_left(orig_gb));
  
      /* superframe header */
      if (get_bits_left(gb) < 14)
@@@ -1805,8 -1820,10 +1818,8 @@@ static int synth_superframe(AVCodecCont
  
      /* get output buffer */
      frame->nb_samples = 480;
 -    if ((res = ff_get_buffer(ctx, frame, 0)) < 0) {
 -        av_log(ctx, AV_LOG_ERROR, "get_buffer() failed\n");
 +    if ((res = ff_get_buffer(ctx, frame, 0)) < 0)
          return res;
 -    }
      frame->nb_samples = n_samples;
      samples = (float *)frame->data[0];
  
@@@ -1938,7 -1955,7 +1951,7 @@@ static int wmavoice_decode_packet(AVCod
      int size, res, pos;
  
      /* Packets are sometimes a multiple of ctx->block_align, with a packet
 -     * header at each ctx->block_align bytes. However, Libav's ASF demuxer
 +     * header at each ctx->block_align bytes. However, FFmpeg's ASF demuxer
       * feeds us ASF packets, which may concatenate multiple "codec" packets
       * in a single "muxer" packet, so we artificially emulate that by
       * capping the packet size at ctx->block_align. */
          /* rewind bit reader to start of last (incomplete) superframe... */
          init_get_bits(gb, avpkt->data, size << 3);
          skip_bits_long(gb, (size << 3) - pos);
 -        assert(get_bits_left(gb) == pos);
 +        av_assert1(get_bits_left(gb) == pos);
  
          /* ...and cache it for spillover in next packet */
          init_put_bits(&s->pb, s->sframe_cache, SFRAME_CACHE_MAXSIZE);