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.

188 lines
5.1KB

  1. /*
  2. * ADX ADPCM codecs
  3. * Copyright (c) 2001,2003 BERO
  4. *
  5. * This file is part of Libav.
  6. *
  7. * Libav 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. * Libav 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 Libav; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #include "libavutil/intreadwrite.h"
  22. #include "avcodec.h"
  23. #include "adx.h"
  24. /**
  25. * @file
  26. * SEGA CRI adx codecs.
  27. *
  28. * Reference documents:
  29. * http://ku-www.ss.titech.ac.jp/~yatsushi/adx.html
  30. * adx2wav & wav2adx http://www.geocities.co.jp/Playtown/2004/
  31. */
  32. static av_cold int adx_decode_init(AVCodecContext *avctx)
  33. {
  34. avctx->sample_fmt = AV_SAMPLE_FMT_S16;
  35. return 0;
  36. }
  37. /**
  38. * Decode 32 samples from 18 bytes.
  39. *
  40. * A 16-bit scalar value is applied to 32 residuals, which then have a
  41. * 2nd-order LPC filter applied to it to form the output signal for a single
  42. * channel.
  43. */
  44. static void adx_decode(int16_t *out, const uint8_t *in, ADXChannelState *prev)
  45. {
  46. int scale = AV_RB16(in);
  47. int i;
  48. int s0, s1, s2, d;
  49. in += 2;
  50. s1 = prev->s1;
  51. s2 = prev->s2;
  52. for (i = 0; i < 16; i++) {
  53. d = in[i];
  54. d = (signed char)d >> 4;
  55. s0 = (BASEVOL * d * scale + SCALE1 * s1 - SCALE2 * s2) >> 14;
  56. s2 = s1;
  57. s1 = av_clip_int16(s0);
  58. *out++ = s1;
  59. d = in[i];
  60. d = (signed char)(d << 4) >> 4;
  61. s0 = (BASEVOL * d * scale + SCALE1 * s1 - SCALE2 * s2) >> 14;
  62. s2 = s1;
  63. s1 = av_clip_int16(s0);
  64. *out++ = s1;
  65. }
  66. prev->s1 = s1;
  67. prev->s2 = s2;
  68. }
  69. static void adx_decode_stereo(int16_t *out,const uint8_t *in,
  70. ADXChannelState *prev)
  71. {
  72. short tmp[32*2];
  73. int i;
  74. adx_decode(tmp, in, prev);
  75. adx_decode(tmp+32, in+18, prev+1);
  76. for (i = 0; i < 32; i++) {
  77. out[i*2 ] = tmp[i ];
  78. out[i*2+1] = tmp[i+32];
  79. }
  80. }
  81. /**
  82. * Decode stream header.
  83. *
  84. * @param avctx codec context
  85. * @param buf packet data
  86. * @param bufsize packet size
  87. * @return data offset or 0 if header is invalid
  88. */
  89. static int adx_decode_header(AVCodecContext *avctx, const uint8_t *buf,
  90. int bufsize)
  91. {
  92. int offset;
  93. if (buf[0] != 0x80)
  94. return 0;
  95. offset = (AV_RB32(buf) ^ 0x80000000) + 4;
  96. if (bufsize < offset || memcmp(buf + offset - 6, "(c)CRI", 6))
  97. return 0;
  98. avctx->channels = buf[7];
  99. avctx->sample_rate = AV_RB32(buf + 8);
  100. avctx->bit_rate = avctx->sample_rate * avctx->channels * 18 * 8 / 32;
  101. return offset;
  102. }
  103. static int adx_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
  104. AVPacket *avpkt)
  105. {
  106. const uint8_t *buf0 = avpkt->data;
  107. int buf_size = avpkt->size;
  108. ADXContext *c = avctx->priv_data;
  109. int16_t *samples = data;
  110. const uint8_t *buf = buf0;
  111. int rest = buf_size;
  112. if (!c->header_parsed) {
  113. int hdrsize = adx_decode_header(avctx, buf, rest);
  114. if (!hdrsize)
  115. return -1;
  116. c->header_parsed = 1;
  117. buf += hdrsize;
  118. rest -= hdrsize;
  119. }
  120. /* 18 bytes of data are expanded into 32*2 bytes of audio,
  121. so guard against buffer overflows */
  122. if (rest / 18 > *data_size / 64)
  123. rest = (*data_size / 64) * 18;
  124. if (c->in_temp) {
  125. int copysize = 18 * avctx->channels - c->in_temp;
  126. memcpy(c->dec_temp + c->in_temp, buf, copysize);
  127. rest -= copysize;
  128. buf += copysize;
  129. if (avctx->channels == 1) {
  130. adx_decode(samples, c->dec_temp, c->prev);
  131. samples += 32;
  132. } else {
  133. adx_decode_stereo(samples, c->dec_temp, c->prev);
  134. samples += 32*2;
  135. }
  136. }
  137. if (avctx->channels == 1) {
  138. while (rest >= 18) {
  139. adx_decode(samples, buf, c->prev);
  140. rest -= 18;
  141. buf += 18;
  142. samples += 32;
  143. }
  144. } else {
  145. while (rest >= 18 * 2) {
  146. adx_decode_stereo(samples, buf, c->prev);
  147. rest -= 18 * 2;
  148. buf += 18 * 2;
  149. samples += 32 * 2;
  150. }
  151. }
  152. c->in_temp = rest;
  153. if (rest) {
  154. memcpy(c->dec_temp, buf, rest);
  155. buf += rest;
  156. }
  157. *data_size = (uint8_t*)samples - (uint8_t*)data;
  158. return buf - buf0;
  159. }
  160. AVCodec ff_adpcm_adx_decoder = {
  161. .name = "adpcm_adx",
  162. .type = AVMEDIA_TYPE_AUDIO,
  163. .id = CODEC_ID_ADPCM_ADX,
  164. .priv_data_size = sizeof(ADXContext),
  165. .init = adx_decode_init,
  166. .decode = adx_decode_frame,
  167. .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"),
  168. };