You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

165 lines
4.9KB

  1. /*
  2. * common functions for the ATRAC family of decoders
  3. *
  4. * Copyright (c) 2006-2013 Maxim Poliakovski
  5. * Copyright (c) 2006-2008 Benjamin Larsson
  6. *
  7. * This file is part of Libav.
  8. *
  9. * Libav is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation; either
  12. * version 2.1 of the License, or (at your option) any later version.
  13. *
  14. * Libav is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with Libav; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. */
  23. /**
  24. * @file
  25. */
  26. #include <math.h>
  27. #include <stddef.h>
  28. #include <stdio.h>
  29. #include <string.h>
  30. #include "avcodec.h"
  31. #include "atrac.h"
  32. float ff_atrac_sf_table[64];
  33. static float qmf_window[48];
  34. static const float qmf_48tap_half[24] = {
  35. -0.00001461907, -0.00009205479,-0.000056157569,0.00030117269,
  36. 0.0002422519, -0.00085293897,-0.0005205574, 0.0020340169,
  37. 0.00078333891, -0.0042153862, -0.00075614988, 0.0078402944,
  38. -0.000061169922,-0.01344162, 0.0024626821, 0.021736089,
  39. -0.007801671, -0.034090221, 0.01880949, 0.054326009,
  40. -0.043596379, -0.099384367, 0.13207909, 0.46424159
  41. };
  42. av_cold void ff_atrac_generate_tables(void)
  43. {
  44. int i;
  45. float s;
  46. /* Generate scale factors */
  47. if (!ff_atrac_sf_table[63])
  48. for (i=0 ; i<64 ; i++)
  49. ff_atrac_sf_table[i] = pow(2.0, (i - 15) / 3.0);
  50. /* Generate the QMF window. */
  51. if (!qmf_window[47])
  52. for (i=0 ; i<24; i++) {
  53. s = qmf_48tap_half[i] * 2.0;
  54. qmf_window[i] = qmf_window[47 - i] = s;
  55. }
  56. }
  57. av_cold void ff_atrac_init_gain_compensation(AtracGCContext *gctx, int id2exp_offset,
  58. int loc_scale)
  59. {
  60. int i;
  61. gctx->loc_scale = loc_scale;
  62. gctx->loc_size = 1 << loc_scale;
  63. gctx->id2exp_offset = id2exp_offset;
  64. /* Generate gain level table. */
  65. for (i = 0; i < 16; i++)
  66. gctx->gain_tab1[i] = powf(2.0, id2exp_offset - i);
  67. /* Generate gain interpolation table. */
  68. for (i = -15; i < 16; i++)
  69. gctx->gain_tab2[i + 15] = powf(2.0, -1.0f / gctx->loc_size * i);
  70. }
  71. void ff_atrac_gain_compensation(AtracGCContext *gctx, float *in, float *prev,
  72. AtracGainInfo *gc_now, AtracGainInfo *gc_next,
  73. int num_samples, float *out)
  74. {
  75. float lev, gc_scale, gain_inc;
  76. int i, pos, lastpos;
  77. gc_scale = gc_next->num_points ? gctx->gain_tab1[gc_next->lev_code[0]]
  78. : 1.0f;
  79. if (!gc_now->num_points) {
  80. for (pos = 0; pos < num_samples; pos++)
  81. out[pos] = in[pos] * gc_scale + prev[pos];
  82. } else {
  83. pos = 0;
  84. for (i = 0; i < gc_now->num_points; i++) {
  85. lastpos = gc_now->loc_code[i] << gctx->loc_scale;
  86. lev = gctx->gain_tab1[gc_now->lev_code[i]];
  87. gain_inc = gctx->gain_tab2[(i + 1 < gc_now->num_points ? gc_now->lev_code[i + 1]
  88. : gctx->id2exp_offset) -
  89. gc_now->lev_code[i] + 15];
  90. /* apply constant gain level and overlap */
  91. for (; pos < lastpos; pos++)
  92. out[pos] = (in[pos] * gc_scale + prev[pos]) * lev;
  93. /* interpolate between two different gain levels */
  94. for (; pos < lastpos + gctx->loc_size; pos++) {
  95. out[pos] = (in[pos] * gc_scale + prev[pos]) * lev;
  96. lev *= gain_inc;
  97. }
  98. }
  99. for (; pos < num_samples; pos++)
  100. out[pos] = in[pos] * gc_scale + prev[pos];
  101. }
  102. /* copy the overlapping part into the delay buffer */
  103. memcpy(prev, &in[num_samples], num_samples * sizeof(float));
  104. }
  105. void ff_atrac_iqmf (float *inlo, float *inhi, unsigned int nIn, float *pOut, float *delayBuf, float *temp)
  106. {
  107. int i, j;
  108. float *p1, *p3;
  109. memcpy(temp, delayBuf, 46*sizeof(float));
  110. p3 = temp + 46;
  111. /* loop1 */
  112. for(i=0; i<nIn; i+=2){
  113. p3[2*i+0] = inlo[i ] + inhi[i ];
  114. p3[2*i+1] = inlo[i ] - inhi[i ];
  115. p3[2*i+2] = inlo[i+1] + inhi[i+1];
  116. p3[2*i+3] = inlo[i+1] - inhi[i+1];
  117. }
  118. /* loop2 */
  119. p1 = temp;
  120. for (j = nIn; j != 0; j--) {
  121. float s1 = 0.0;
  122. float s2 = 0.0;
  123. for (i = 0; i < 48; i += 2) {
  124. s1 += p1[i] * qmf_window[i];
  125. s2 += p1[i+1] * qmf_window[i+1];
  126. }
  127. pOut[0] = s2;
  128. pOut[1] = s1;
  129. p1 += 2;
  130. pOut += 2;
  131. }
  132. /* Update the delay buffer. */
  133. memcpy(delayBuf, temp + nIn*2, 46*sizeof(float));
  134. }