Merge commit '1afa8a7568ba57ad0cd2923f6e641e10d32cded4'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 14 Nov 2013 14:42:05 +0000 (15:42 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 14 Nov 2013 14:42:05 +0000 (15:42 +0100)
* commit '1afa8a7568ba57ad0cd2923f6e641e10d32cded4':
  twinvq: support multiple frames per packet

Conflicts:
libavcodec/twinvq.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/metasound.c
libavcodec/metasound_data.c
libavcodec/twinvq.c
libavcodec/twinvq.h
libavcodec/twinvqdec.c

@@@ -172,61 -172,70 +172,70 @@@ static int metasound_read_bitstream(AVC
  
      init_get_bits(&gb, buf, buf_size * 8);
  
-     bits->window_type = get_bits(&gb, TWINVQ_WINDOW_TYPE_BITS);
+     for (tctx->cur_frame = 0; tctx->cur_frame < tctx->frames_per_packet;
+          tctx->cur_frame++) {
+         bits = tctx->bits + tctx->cur_frame;
  
-     if (bits->window_type > 8) {
-         av_log(avctx, AV_LOG_ERROR, "Invalid window type, broken sample?\n");
-         return AVERROR_INVALIDDATA;
-     }
+         bits->window_type = get_bits(&gb, TWINVQ_WINDOW_TYPE_BITS);
  
-     bits->ftype = ff_twinvq_wtype_to_ftype_table[tctx->bits.window_type];
+         if (bits->window_type > 8) {
+             av_log(avctx, AV_LOG_ERROR, "Invalid window type, broken sample?\n");
+             return AVERROR_INVALIDDATA;
+         }
  
-     sub = mtab->fmode[bits->ftype].sub;
+         bits->ftype = ff_twinvq_wtype_to_ftype_table[tctx->bits[tctx->cur_frame].window_type];
  
-     if (bits->ftype != TWINVQ_FT_SHORT)
-         get_bits(&gb, 2);
+         sub = mtab->fmode[bits->ftype].sub;
  
-     read_cb_data(tctx, &gb, bits->main_coeffs, bits->ftype);
+         if (bits->ftype != TWINVQ_FT_SHORT)
+             get_bits(&gb, 2);
  
-     for (i = 0; i < channels; i++)
-         for (j = 0; j < sub; j++)
-             for (k = 0; k < mtab->fmode[bits->ftype].bark_n_coef; k++)
-                 bits->bark1[i][j][k] =
-                     get_bits(&gb, mtab->fmode[bits->ftype].bark_n_bit);
+         read_cb_data(tctx, &gb, bits->main_coeffs, bits->ftype);
  
-     for (i = 0; i < channels; i++)
-         for (j = 0; j < sub; j++)
-             bits->bark_use_hist[i][j] = get_bits1(&gb);
+         for (i = 0; i < channels; i++)
+             for (j = 0; j < sub; j++)
+                 for (k = 0; k < mtab->fmode[bits->ftype].bark_n_coef; k++)
+                     bits->bark1[i][j][k] =
+                         get_bits(&gb, mtab->fmode[bits->ftype].bark_n_bit);
  
-     if (bits->ftype == TWINVQ_FT_LONG) {
          for (i = 0; i < channels; i++)
-             bits->gain_bits[i] = get_bits(&gb, TWINVQ_GAIN_BITS);
-     } else {
-         for (i = 0; i < channels; i++) {
-             bits->gain_bits[i] = get_bits(&gb, TWINVQ_GAIN_BITS);
              for (j = 0; j < sub; j++)
-                 bits->sub_gain_bits[i * sub + j] =
-                     get_bits(&gb, TWINVQ_SUB_GAIN_BITS);
+                 bits->bark_use_hist[i][j] = get_bits1(&gb);
+         if (bits->ftype == TWINVQ_FT_LONG) {
+             for (i = 0; i < channels; i++)
+                 bits->gain_bits[i] = get_bits(&gb, TWINVQ_GAIN_BITS);
+         } else {
+             for (i = 0; i < channels; i++) {
+                 bits->gain_bits[i] = get_bits(&gb, TWINVQ_GAIN_BITS);
+                 for (j = 0; j < sub; j++)
+                     bits->sub_gain_bits[i * sub + j] =
+                         get_bits(&gb, TWINVQ_SUB_GAIN_BITS);
+             }
          }
-     }
  
-     for (i = 0; i < channels; i++) {
-         bits->lpc_hist_idx[i] = get_bits(&gb, mtab->lsp_bit0);
-         bits->lpc_idx1[i]     = get_bits(&gb, mtab->lsp_bit1);
+         for (i = 0; i < channels; i++) {
+             bits->lpc_hist_idx[i] = get_bits(&gb, mtab->lsp_bit0);
+             bits->lpc_idx1[i]     = get_bits(&gb, mtab->lsp_bit1);
  
-         for (j = 0; j < mtab->lsp_split; j++)
-             bits->lpc_idx2[i][j] = get_bits(&gb, mtab->lsp_bit2);
-     }
+             for (j = 0; j < mtab->lsp_split; j++)
+                 bits->lpc_idx2[i][j] = get_bits(&gb, mtab->lsp_bit2);
+         }
  
-     if (bits->ftype == TWINVQ_FT_LONG) {
-         read_cb_data(tctx, &gb, bits->ppc_coeffs, 3);
-         for (i = 0; i < channels; i++) {
-             bits->p_coef[i] = get_bits(&gb, mtab->ppc_period_bit);
-             bits->g_coef[i] = get_bits(&gb, mtab->pgain_bit);
+         if (bits->ftype == TWINVQ_FT_LONG) {
+             read_cb_data(tctx, &gb, bits->ppc_coeffs, 3);
+             for (i = 0; i < channels; i++) {
+                 bits->p_coef[i] = get_bits(&gb, mtab->ppc_period_bit);
+                 bits->g_coef[i] = get_bits(&gb, mtab->pgain_bit);
+             }
          }
+         // subframes are aligned to nibbles
+         if (get_bits_count(&gb) & 3)
+             skip_bits(&gb, 4 - (get_bits_count(&gb) & 3));
      }
  
 -    return 0;
 +    return (get_bits_count(&gb) + 7) / 8;
  }
  
  typedef struct MetasoundProps {
Simple merge
@@@ -483,9 -486,11 +486,9 @@@ int ff_twinvq_decode_frame(AVCodecConte
  
      /* get output buffer */
      if (tctx->discarded_packets >= 2) {
-         frame->nb_samples = mtab->size;
+         frame->nb_samples = mtab->size * tctx->frames_per_packet;
 -        if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
 -            av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 +        if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
              return ret;
 -        }
          out = (float **)frame->extended_data;
      }
  
Simple merge
Simple merge