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.

179 lines
5.4KB

  1. /*
  2. * ADX ADPCM codecs
  3. * Copyright (c) 2001,2003 BERO
  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 "avcodec.h"
  22. #include "adx.h"
  23. #include "bytestream.h"
  24. #include "put_bits.h"
  25. /**
  26. * @file
  27. * SEGA CRI adx codecs.
  28. *
  29. * Reference documents:
  30. * http://ku-www.ss.titech.ac.jp/~yatsushi/adx.html
  31. * adx2wav & wav2adx http://www.geocities.co.jp/Playtown/2004/
  32. */
  33. static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
  34. ADXChannelState *prev, int channels)
  35. {
  36. PutBitContext pb;
  37. int scale;
  38. int i, j;
  39. int s0, s1, s2, d;
  40. int max = 0;
  41. int min = 0;
  42. int data[BLOCK_SAMPLES];
  43. s1 = prev->s1;
  44. s2 = prev->s2;
  45. for (i = 0, j = 0; j < 32; i += channels, j++) {
  46. s0 = wav[i];
  47. d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
  48. data[j] = d;
  49. if (max < d)
  50. max = d;
  51. if (min > d)
  52. min = d;
  53. s2 = s1;
  54. s1 = s0;
  55. }
  56. prev->s1 = s1;
  57. prev->s2 = s2;
  58. if (max == 0 && min == 0) {
  59. memset(adx, 0, BLOCK_SIZE);
  60. return;
  61. }
  62. if (max / 7 > -min / 8)
  63. scale = max / 7;
  64. else
  65. scale = -min / 8;
  66. if (scale == 0)
  67. scale = 1;
  68. AV_WB16(adx, scale);
  69. init_put_bits(&pb, adx + 2, 16);
  70. for (i = 0; i < BLOCK_SAMPLES; i++)
  71. put_sbits(&pb, 4, av_clip(data[i] / scale, -8, 7));
  72. flush_put_bits(&pb);
  73. }
  74. #define HEADER_SIZE 36
  75. static int adx_encode_header(AVCodecContext *avctx, uint8_t *buf, int bufsize)
  76. {
  77. ADXContext *c = avctx->priv_data;
  78. if (bufsize < HEADER_SIZE)
  79. return AVERROR(EINVAL);
  80. bytestream_put_be16(&buf, 0x8000); /* header signature */
  81. bytestream_put_be16(&buf, HEADER_SIZE - 4); /* copyright offset */
  82. bytestream_put_byte(&buf, 3); /* encoding */
  83. bytestream_put_byte(&buf, BLOCK_SIZE); /* block size */
  84. bytestream_put_byte(&buf, 4); /* sample size */
  85. bytestream_put_byte(&buf, avctx->channels); /* channels */
  86. bytestream_put_be32(&buf, avctx->sample_rate); /* sample rate */
  87. bytestream_put_be32(&buf, 0); /* total sample count */
  88. bytestream_put_be16(&buf, c->cutoff); /* cutoff frequency */
  89. bytestream_put_byte(&buf, 3); /* version */
  90. bytestream_put_byte(&buf, 0); /* flags */
  91. bytestream_put_be32(&buf, 0); /* unknown */
  92. bytestream_put_be32(&buf, 0); /* loop enabled */
  93. bytestream_put_be16(&buf, 0); /* padding */
  94. bytestream_put_buffer(&buf, "(c)CRI", 6); /* copyright signature */
  95. return HEADER_SIZE;
  96. }
  97. static av_cold int adx_encode_init(AVCodecContext *avctx)
  98. {
  99. ADXContext *c = avctx->priv_data;
  100. if (avctx->channels > 2) {
  101. av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n");
  102. return AVERROR(EINVAL);
  103. }
  104. avctx->frame_size = BLOCK_SAMPLES;
  105. avctx->coded_frame = avcodec_alloc_frame();
  106. /* the cutoff can be adjusted, but this seems to work pretty well */
  107. c->cutoff = 500;
  108. ff_adx_calculate_coeffs(c->cutoff, avctx->sample_rate, COEFF_BITS, c->coeff);
  109. return 0;
  110. }
  111. static av_cold int adx_encode_close(AVCodecContext *avctx)
  112. {
  113. av_freep(&avctx->coded_frame);
  114. return 0;
  115. }
  116. static int adx_encode_frame(AVCodecContext *avctx, uint8_t *frame,
  117. int buf_size, void *data)
  118. {
  119. ADXContext *c = avctx->priv_data;
  120. const int16_t *samples = data;
  121. uint8_t *dst = frame;
  122. int ch;
  123. if (!c->header_parsed) {
  124. int hdrsize;
  125. if ((hdrsize = adx_encode_header(avctx, dst, buf_size)) < 0) {
  126. av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
  127. return AVERROR(EINVAL);
  128. }
  129. dst += hdrsize;
  130. buf_size -= hdrsize;
  131. c->header_parsed = 1;
  132. }
  133. if (buf_size < BLOCK_SIZE * avctx->channels) {
  134. av_log(avctx, AV_LOG_ERROR, "output buffer is too small\n");
  135. return AVERROR(EINVAL);
  136. }
  137. for (ch = 0; ch < avctx->channels; ch++) {
  138. adx_encode(c, dst, samples + ch, &c->prev[ch], avctx->channels);
  139. dst += BLOCK_SIZE;
  140. }
  141. return dst - frame;
  142. }
  143. AVCodec ff_adpcm_adx_encoder = {
  144. .name = "adpcm_adx",
  145. .type = AVMEDIA_TYPE_AUDIO,
  146. .id = CODEC_ID_ADPCM_ADX,
  147. .priv_data_size = sizeof(ADXContext),
  148. .init = adx_encode_init,
  149. .encode = adx_encode_frame,
  150. .close = adx_encode_close,
  151. .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16,
  152. AV_SAMPLE_FMT_NONE },
  153. .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"),
  154. };