g729dec.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /*
  2. * G.729 decoder
  3. * Copyright (c) 2008 Vladimir Voroshilov
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include <stdlib.h>
  22. #include <inttypes.h>
  23. #include <limits.h>
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include <math.h>
  27. #include <assert.h>
  28. #include "avcodec.h"
  29. #include "libavutil/avutil.h"
  30. #include "bitstream.h"
  31. #include "g729.h"
  32. #include "lsp.h"
  33. #include "celp_math.h"
  34. #include "acelp_filters.h"
  35. #include "acelp_pitch_delay.h"
  36. #include "acelp_vectors.h"
  37. #include "g729data.h"
  38. /**
  39. * minimum quantized LSF value (3.2.4)
  40. * 0.005 in Q13
  41. */
  42. #define LSFQ_MIN 40
  43. /**
  44. * maximum quantized LSF value (3.2.4)
  45. * 3.135 in Q13
  46. */
  47. #define LSFQ_MAX 25681
  48. /**
  49. * minimum LSF distance (3.2.4)
  50. * 0.0391 in Q13
  51. */
  52. #define LSFQ_DIFF_MIN 321
  53. /**
  54. * minimum gain pitch value (3.8, Equation 47)
  55. * 0.2 in (1.14)
  56. */
  57. #define SHARP_MIN 3277
  58. /**
  59. * maximum gain pitch value (3.8, Equation 47)
  60. * (EE) This does not comply with the specification.
  61. * Specification says about 0.8, which should be
  62. * 13107 in (1.14), but reference C code uses
  63. * 13017 (equals to 0.7945) instead of it.
  64. */
  65. #define SHARP_MAX 13017
  66. typedef struct
  67. {
  68. int sample_rate;
  69. uint8_t packed_frame_size; ///< input frame size(in bytes)
  70. uint8_t unpacked_frame_size;///< output frame size (in bytes)
  71. uint8_t fc_indexes_bits; ///< size (in bits) of fixed-codebook index entry
  72. /// mr_energy = mean_energy + 10 * log10(2^26 * subframe_size) in (7.13)
  73. int mr_energy;
  74. } G729_format_description;
  75. /**
  76. * \brief pseudo random number generator
  77. */
  78. static inline uint16_t g729_random(uint16_t value)
  79. {
  80. return 31821 * value + 13849;
  81. }
  82. /**
  83. * Get parity bit of bit 2..7
  84. */
  85. static inline int g729_get_parity(uint8_t value)
  86. {
  87. return (0x6996966996696996ULL >> (value >> 2)) & 1;
  88. }
  89. if(avctx->channels != 1)
  90. {
  91. av_log(avctx, AV_LOG_ERROR, "Only mono sound is supported (requested channels: %d).\n", avctx->channels);
  92. return AVERROR_NOFMT;
  93. }
  94. ff_acelp_weighted_vector_sum(
  95. fc + pitch_delay_int[i],
  96. fc + pitch_delay_int[i],
  97. fc,
  98. 1 << 14,
  99. av_clip(ctx->gain_pitch, SHARP_MIN, SHARP_MAX),
  100. 0,
  101. 14,
  102. ctx->subframe_size - pitch_delay_int[i]);
  103. if(ctx->frame_erasure)
  104. {
  105. ctx->gain_pitch = (29491 * ctx->gain_pitch) >> 15; // 0.9 (0.15)
  106. ctx->gain_code = (2007 * ctx->gain_code) >> 11; // 0.98 in (0.11)
  107. gain_corr_factor = 0;
  108. }
  109. else
  110. {
  111. ctx->gain_pitch = cb_gain_1st_8k[parm->gc_1st_index[i]][0] +
  112. cb_gain_2nd_8k[parm->gc_2nd_index[i]][0];
  113. gain_corr_factor = cb_gain_1st_8k[parm->gc_1st_index[i]][1] +
  114. cb_gain_2nd_8k[parm->gc_2nd_index[i]][1];
  115. ff_acelp_weighted_vector_sum(
  116. ctx->exc + i * ctx->subframe_size,
  117. ctx->exc + i * ctx->subframe_size,
  118. fc,
  119. (!voicing && ctx->frame_erasure) ? 0 : ctx->gain_pitch,
  120. ( voicing && ctx->frame_erasure) ? 0 : ctx->gain_code,
  121. 1<<13,
  122. 14,
  123. ctx->subframe_size);
  124. if (buf_size<packed_frame_size)
  125. {
  126. av_log(avctx, AV_LOG_ERROR, "Error processing packet: packet size too small\n");
  127. return AVERROR(EIO);
  128. }
  129. if (*data_size<unpacked_frame_size)
  130. {
  131. av_log(avctx, AV_LOG_ERROR, "Error processing packet: output buffer too small\n");
  132. return AVERROR(EIO);
  133. }
  134. AVCodec g729_decoder =
  135. {
  136. "g729",
  137. CODEC_TYPE_AUDIO,
  138. CODEC_ID_G729,
  139. sizeof(G729_Context),
  140. ff_g729_decoder_init,
  141. NULL,
  142. NULL,
  143. ff_g729_decode_frame,
  144. .long_name = NULL_IF_CONFIG_SMALL("G.729"),
  145. };