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.

210 lines
5.5KB

  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. #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. /* 18 bytes <-> 32 samples */
  34. static void adx_encode(ADXContext *c, unsigned char *adx, const short *wav,
  35. ADXChannelState *prev)
  36. {
  37. PutBitContext pb;
  38. int scale;
  39. int i;
  40. int s0,s1,s2,d;
  41. int max=0;
  42. int min=0;
  43. int data[32];
  44. s1 = prev->s1;
  45. s2 = prev->s2;
  46. for(i=0;i<32;i++) {
  47. s0 = wav[i];
  48. d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
  49. data[i]=d;
  50. if (max<d) max=d;
  51. if (min>d) min=d;
  52. s2 = s1;
  53. s1 = s0;
  54. }
  55. prev->s1 = s1;
  56. prev->s2 = s2;
  57. /* -8..+7 */
  58. if (max==0 && min==0) {
  59. memset(adx,0,18);
  60. return;
  61. }
  62. if (max/7>-min/8) scale = max/7;
  63. else scale = -min/8;
  64. if (scale==0) scale=1;
  65. AV_WB16(adx, scale);
  66. init_put_bits(&pb, adx + 2, 16);
  67. for (i = 0; i < 32; i++)
  68. put_sbits(&pb, 4, av_clip(data[i]/scale, -8, 7));
  69. flush_put_bits(&pb);
  70. }
  71. static int adx_encode_header(AVCodecContext *avctx,unsigned char *buf,size_t bufsize)
  72. {
  73. #if 0
  74. struct {
  75. uint32_t offset; /* 0x80000000 + sample start - 4 */
  76. unsigned char unknown1[3]; /* 03 12 04 */
  77. unsigned char channel; /* 1 or 2 */
  78. uint32_t freq;
  79. uint32_t size;
  80. uint32_t unknown2; /* 01 f4 03 00 */
  81. uint32_t unknown3; /* 00 00 00 00 */
  82. uint32_t unknown4; /* 00 00 00 00 */
  83. /* if loop
  84. unknown3 00 15 00 01
  85. unknown4 00 00 00 01
  86. long loop_start_sample;
  87. long loop_start_byte;
  88. long loop_end_sample;
  89. long loop_end_byte;
  90. long
  91. */
  92. } adxhdr; /* big endian */
  93. /* offset-6 "(c)CRI" */
  94. #endif
  95. ADXContext *c = avctx->priv_data;
  96. AV_WB32(buf+0x00,0x80000000|0x20);
  97. AV_WB32(buf+0x04,0x03120400|avctx->channels);
  98. AV_WB32(buf+0x08,avctx->sample_rate);
  99. AV_WB32(buf+0x0c,0); /* FIXME: set after */
  100. AV_WB16(buf + 0x10, c->cutoff);
  101. AV_WB32(buf + 0x12, 0x03000000);
  102. AV_WB32(buf + 0x16, 0x00000000);
  103. AV_WB32(buf + 0x1a, 0x00000000);
  104. memcpy (buf + 0x1e, "(c)CRI", 6);
  105. return 0x20+4;
  106. }
  107. static av_cold int adx_encode_init(AVCodecContext *avctx)
  108. {
  109. ADXContext *c = avctx->priv_data;
  110. if (avctx->channels > 2)
  111. return -1; /* only stereo or mono =) */
  112. avctx->frame_size = 32;
  113. avctx->coded_frame= avcodec_alloc_frame();
  114. avctx->coded_frame->key_frame= 1;
  115. // avctx->bit_rate = avctx->sample_rate*avctx->channels*18*8/32;
  116. /* the cutoff can be adjusted, but this seems to work pretty well */
  117. c->cutoff = 500;
  118. ff_adx_calculate_coeffs(c->cutoff, avctx->sample_rate, COEFF_BITS, c->coeff);
  119. av_log(avctx, AV_LOG_DEBUG, "adx encode init\n");
  120. return 0;
  121. }
  122. static av_cold int adx_encode_close(AVCodecContext *avctx)
  123. {
  124. av_freep(&avctx->coded_frame);
  125. return 0;
  126. }
  127. static int adx_encode_frame(AVCodecContext *avctx,
  128. uint8_t *frame, int buf_size, void *data)
  129. {
  130. ADXContext *c = avctx->priv_data;
  131. const short *samples = data;
  132. unsigned char *dst = frame;
  133. int rest = avctx->frame_size;
  134. /*
  135. input data size =
  136. avconv.c:do_audio_out()
  137. frame_bytes = enc->frame_size * 2 * enc->channels;
  138. */
  139. // printf("sz=%d ",buf_size); fflush(stdout);
  140. if (!c->header_parsed) {
  141. int hdrsize = adx_encode_header(avctx,dst,buf_size);
  142. dst+=hdrsize;
  143. c->header_parsed = 1;
  144. }
  145. if (avctx->channels==1) {
  146. while(rest>=32) {
  147. adx_encode(c, dst, samples, c->prev);
  148. dst+=18;
  149. samples+=32;
  150. rest-=32;
  151. }
  152. } else {
  153. while(rest>=32*2) {
  154. short tmpbuf[32*2];
  155. int i;
  156. for(i=0;i<32;i++) {
  157. tmpbuf[i] = samples[i*2];
  158. tmpbuf[i+32] = samples[i*2+1];
  159. }
  160. adx_encode(c, dst, tmpbuf, c->prev);
  161. adx_encode(c, dst + 18, tmpbuf + 32, c->prev + 1);
  162. dst+=18*2;
  163. samples+=32*2;
  164. rest-=32*2;
  165. }
  166. }
  167. return dst-frame;
  168. }
  169. AVCodec ff_adpcm_adx_encoder = {
  170. .name = "adpcm_adx",
  171. .type = AVMEDIA_TYPE_AUDIO,
  172. .id = CODEC_ID_ADPCM_ADX,
  173. .priv_data_size = sizeof(ADXContext),
  174. .init = adx_encode_init,
  175. .encode = adx_encode_frame,
  176. .close = adx_encode_close,
  177. .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,AV_SAMPLE_FMT_NONE},
  178. .long_name = NULL_IF_CONFIG_SMALL("SEGA CRI ADX ADPCM"),
  179. };