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.

635 lines
16KB

  1. /*
  2. * Interplay ACM decoder
  3. *
  4. * Copyright (c) 2004-2008 Marko Kreen
  5. * Copyright (c) 2008 Adam Gashlin
  6. * Copyright (c) 2015 Paul B Mahol
  7. *
  8. * Permission to use, copy, modify, and distribute this software for any
  9. * purpose with or without fee is hereby granted, provided that the above
  10. * copyright notice and this permission notice appear in all copies.
  11. *
  12. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  13. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  14. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  15. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  16. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  17. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  18. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19. */
  20. #include "libavutil/intreadwrite.h"
  21. #define BITSTREAM_READER_LE
  22. #include "avcodec.h"
  23. #include "get_bits.h"
  24. #include "internal.h"
  25. static const int8_t map_1bit[] = { -1, +1 };
  26. static const int8_t map_2bit_near[] = { -2, -1, +1, +2 };
  27. static const int8_t map_2bit_far[] = { -3, -2, +2, +3 };
  28. static const int8_t map_3bit[] = { -4, -3, -2, -1, +1, +2, +3, +4 };
  29. static int mul_3x3 [3 * 3 * 3];
  30. static int mul_3x5 [5 * 5 * 5];
  31. static int mul_2x11[11 * 11];
  32. typedef struct InterplayACMContext {
  33. GetBitContext gb;
  34. uint8_t *bitstream;
  35. int max_framesize;
  36. int bitstream_size;
  37. int bitstream_index;
  38. int level;
  39. int rows;
  40. int cols;
  41. int wrapbuf_len;
  42. int block_len;
  43. int skip;
  44. int *block;
  45. int *wrapbuf;
  46. int *ampbuf;
  47. int *midbuf;
  48. } InterplayACMContext;
  49. static av_cold int decode_init(AVCodecContext *avctx)
  50. {
  51. InterplayACMContext *s = avctx->priv_data;
  52. int x1, x2, x3;
  53. if (avctx->extradata_size < 14)
  54. return AVERROR_INVALIDDATA;
  55. if (avctx->channels <= 0) {
  56. av_log(avctx, AV_LOG_ERROR, "Invalid number of channels: %d\n", avctx->channels);
  57. return AVERROR_INVALIDDATA;
  58. }
  59. s->level = AV_RL16(avctx->extradata + 12) & 0xf;
  60. s->rows = AV_RL16(avctx->extradata + 12) >> 4;
  61. s->cols = 1 << s->level;
  62. s->wrapbuf_len = 2 * s->cols - 2;
  63. s->block_len = s->rows * s->cols;
  64. s->max_framesize = s->block_len;
  65. s->block = av_calloc(s->block_len, sizeof(int));
  66. s->wrapbuf = av_calloc(s->wrapbuf_len, sizeof(int));
  67. s->ampbuf = av_calloc(0x10000, sizeof(int));
  68. s->bitstream = av_calloc(s->max_framesize + AV_INPUT_BUFFER_PADDING_SIZE / sizeof(*s->bitstream) + 1, sizeof(*s->bitstream));
  69. if (!s->block || !s->wrapbuf || !s->ampbuf || !s->bitstream)
  70. return AVERROR(ENOMEM);
  71. s->midbuf = s->ampbuf + 0x8000;
  72. avctx->sample_fmt = AV_SAMPLE_FMT_S16;
  73. for (x3 = 0; x3 < 3; x3++)
  74. for (x2 = 0; x2 < 3; x2++)
  75. for (x1 = 0; x1 < 3; x1++)
  76. mul_3x3[x1 + x2 * 3 + x3* 3 * 3] = x1 + (x2 << 4) + (x3 << 8);
  77. for (x3 = 0; x3 < 5; x3++)
  78. for (x2 = 0; x2 < 5; x2++)
  79. for (x1 = 0; x1 < 5; x1++)
  80. mul_3x5[x1 + x2 * 5 + x3 * 5 * 5] = x1 + (x2 << 4) + (x3 << 8);
  81. for (x2 = 0; x2 < 11; x2++)
  82. for (x1 = 0; x1 < 11; x1++)
  83. mul_2x11[x1 + x2 * 11] = x1 + (x2 << 4);
  84. return 0;
  85. }
  86. #define set_pos(s, r, c, idx) do { \
  87. unsigned pos = ((r) << s->level) + (c); \
  88. s->block[pos] = s->midbuf[(idx)]; \
  89. } while (0)
  90. static int zero(InterplayACMContext *s, unsigned ind, unsigned col)
  91. {
  92. unsigned i;
  93. for (i = 0; i < s->rows; i++)
  94. set_pos(s, i, col, 0);
  95. return 0;
  96. }
  97. static int bad(InterplayACMContext *s, unsigned ind, unsigned col)
  98. {
  99. return AVERROR_INVALIDDATA;
  100. }
  101. static int linear(InterplayACMContext *s, unsigned ind, unsigned col)
  102. {
  103. GetBitContext *gb = &s->gb;
  104. unsigned int i;
  105. int b, middle = 1 << (ind - 1);
  106. for (i = 0; i < s->rows; i++) {
  107. b = get_bits(gb, ind);
  108. set_pos(s, i, col, b - middle);
  109. }
  110. return 0;
  111. }
  112. static int k13(InterplayACMContext *s, unsigned ind, unsigned col)
  113. {
  114. GetBitContext *gb = &s->gb;
  115. unsigned i, b;
  116. for (i = 0; i < s->rows; i++) {
  117. b = get_bits1(gb);
  118. if (b == 0) {
  119. set_pos(s, i++, col, 0);
  120. if (i >= s->rows)
  121. break;
  122. set_pos(s, i, col, 0);
  123. continue;
  124. }
  125. b = get_bits1(gb);
  126. if (b == 0) {
  127. set_pos(s, i, col, 0);
  128. continue;
  129. }
  130. b = get_bits1(gb);
  131. set_pos(s, i, col, map_1bit[b]);
  132. }
  133. return 0;
  134. }
  135. static int k12(InterplayACMContext *s, unsigned ind, unsigned col)
  136. {
  137. GetBitContext *gb = &s->gb;
  138. unsigned i, b;
  139. for (i = 0; i < s->rows; i++) {
  140. b = get_bits1(gb);
  141. if (b == 0) {
  142. set_pos(s, i, col, 0);
  143. continue;
  144. }
  145. b = get_bits1(gb);
  146. set_pos(s, i, col, map_1bit[b]);
  147. }
  148. return 0;
  149. }
  150. static int k24(InterplayACMContext *s, unsigned ind, unsigned col)
  151. {
  152. GetBitContext *gb = &s->gb;
  153. unsigned i, b;
  154. for (i = 0; i < s->rows; i++) {
  155. b = get_bits1(gb);
  156. if (b == 0) {
  157. set_pos(s, i++, col, 0);
  158. if (i >= s->rows) break;
  159. set_pos(s, i, col, 0);
  160. continue;
  161. }
  162. b = get_bits1(gb);
  163. if (b == 0) {
  164. set_pos(s, i, col, 0);
  165. continue;
  166. }
  167. b = get_bits(gb, 2);
  168. set_pos(s, i, col, map_2bit_near[b]);
  169. }
  170. return 0;
  171. }
  172. static int k23(InterplayACMContext *s, unsigned ind, unsigned col)
  173. {
  174. GetBitContext *gb = &s->gb;
  175. unsigned i, b;
  176. for (i = 0; i < s->rows; i++) {
  177. b = get_bits1(gb);
  178. if (b == 0) {
  179. set_pos(s, i, col, 0);
  180. continue;
  181. }
  182. b = get_bits(gb, 2);
  183. set_pos(s, i, col, map_2bit_near[b]);
  184. }
  185. return 0;
  186. }
  187. static int k35(InterplayACMContext *s, unsigned ind, unsigned col)
  188. {
  189. GetBitContext *gb = &s->gb;
  190. unsigned i, b;
  191. for (i = 0; i < s->rows; i++) {
  192. b = get_bits1(gb);
  193. if (b == 0) {
  194. set_pos(s, i++, col, 0);
  195. if (i >= s->rows)
  196. break;
  197. set_pos(s, i, col, 0);
  198. continue;
  199. }
  200. b = get_bits1(gb);
  201. if (b == 0) {
  202. set_pos(s, i, col, 0);
  203. continue;
  204. }
  205. b = get_bits1(gb);
  206. if (b == 0) {
  207. b = get_bits1(gb);
  208. set_pos(s, i, col, map_1bit[b]);
  209. continue;
  210. }
  211. b = get_bits(gb, 2);
  212. set_pos(s, i, col, map_2bit_far[b]);
  213. }
  214. return 0;
  215. }
  216. static int k34(InterplayACMContext *s, unsigned ind, unsigned col)
  217. {
  218. GetBitContext *gb = &s->gb;
  219. unsigned i, b;
  220. for (i = 0; i < s->rows; i++) {
  221. b = get_bits1(gb);
  222. if (b == 0) {
  223. set_pos(s, i, col, 0);
  224. continue;
  225. }
  226. b = get_bits1(gb);
  227. if (b == 0) {
  228. b = get_bits1(gb);
  229. set_pos(s, i, col, map_1bit[b]);
  230. continue;
  231. }
  232. b = get_bits(gb, 2);
  233. set_pos(s, i, col, map_2bit_far[b]);
  234. }
  235. return 0;
  236. }
  237. static int k45(InterplayACMContext *s, unsigned ind, unsigned col)
  238. {
  239. GetBitContext *gb = &s->gb;
  240. unsigned i, b;
  241. for (i = 0; i < s->rows; i++) {
  242. b = get_bits1(gb);
  243. if (b == 0) {
  244. set_pos(s, i, col, 0); i++;
  245. if (i >= s->rows)
  246. break;
  247. set_pos(s, i, col, 0);
  248. continue;
  249. }
  250. b = get_bits1(gb);
  251. if (b == 0) {
  252. set_pos(s, i, col, 0);
  253. continue;
  254. }
  255. b = get_bits(gb, 3);
  256. set_pos(s, i, col, map_3bit[b]);
  257. }
  258. return 0;
  259. }
  260. static int k44(InterplayACMContext *s, unsigned ind, unsigned col)
  261. {
  262. GetBitContext *gb = &s->gb;
  263. unsigned i, b;
  264. for (i = 0; i < s->rows; i++) {
  265. b = get_bits1(gb);
  266. if (b == 0) {
  267. set_pos(s, i, col, 0);
  268. continue;
  269. }
  270. b = get_bits(gb, 3);
  271. set_pos(s, i, col, map_3bit[b]);
  272. }
  273. return 0;
  274. }
  275. static int t15(InterplayACMContext *s, unsigned ind, unsigned col)
  276. {
  277. GetBitContext *gb = &s->gb;
  278. unsigned i, b;
  279. int n1, n2, n3;
  280. for (i = 0; i < s->rows; i++) {
  281. /* b = (x1) + (x2 * 3) + (x3 * 9) */
  282. b = get_bits(gb, 5);
  283. if (b > 26) {
  284. av_log(NULL, AV_LOG_ERROR, "Too large b = %d > 26\n", b);
  285. return AVERROR_INVALIDDATA;
  286. }
  287. n1 = (mul_3x3[b] & 0x0F) - 1;
  288. n2 = ((mul_3x3[b] >> 4) & 0x0F) - 1;
  289. n3 = ((mul_3x3[b] >> 8) & 0x0F) - 1;
  290. set_pos(s, i++, col, n1);
  291. if (i >= s->rows)
  292. break;
  293. set_pos(s, i++, col, n2);
  294. if (i >= s->rows)
  295. break;
  296. set_pos(s, i, col, n3);
  297. }
  298. return 0;
  299. }
  300. static int t27(InterplayACMContext *s, unsigned ind, unsigned col)
  301. {
  302. GetBitContext *gb = &s->gb;
  303. unsigned i, b;
  304. int n1, n2, n3;
  305. for (i = 0; i < s->rows; i++) {
  306. /* b = (x1) + (x2 * 5) + (x3 * 25) */
  307. b = get_bits(gb, 7);
  308. if (b > 124) {
  309. av_log(NULL, AV_LOG_ERROR, "Too large b = %d > 124\n", b);
  310. return AVERROR_INVALIDDATA;
  311. }
  312. n1 = (mul_3x5[b] & 0x0F) - 2;
  313. n2 = ((mul_3x5[b] >> 4) & 0x0F) - 2;
  314. n3 = ((mul_3x5[b] >> 8) & 0x0F) - 2;
  315. set_pos(s, i++, col, n1);
  316. if (i >= s->rows)
  317. break;
  318. set_pos(s, i++, col, n2);
  319. if (i >= s->rows)
  320. break;
  321. set_pos(s, i, col, n3);
  322. }
  323. return 0;
  324. }
  325. static int t37(InterplayACMContext *s, unsigned ind, unsigned col)
  326. {
  327. GetBitContext *gb = &s->gb;
  328. unsigned i, b;
  329. int n1, n2;
  330. for (i = 0; i < s->rows; i++) {
  331. /* b = (x1) + (x2 * 11) */
  332. b = get_bits(gb, 7);
  333. if (b > 120) {
  334. av_log(NULL, AV_LOG_ERROR, "Too large b = %d > 120\n", b);
  335. return AVERROR_INVALIDDATA;
  336. }
  337. n1 = (mul_2x11[b] & 0x0F) - 5;
  338. n2 = ((mul_2x11[b] >> 4) & 0x0F) - 5;
  339. set_pos(s, i++, col, n1);
  340. if (i >= s->rows)
  341. break;
  342. set_pos(s, i, col, n2);
  343. }
  344. return 0;
  345. }
  346. typedef int (*filler)(InterplayACMContext *s, unsigned ind, unsigned col);
  347. static const filler filler_list[] = {
  348. zero, bad, bad, linear,
  349. linear, linear, linear, linear,
  350. linear, linear, linear, linear,
  351. linear, linear, linear, linear,
  352. linear, k13, k12, t15,
  353. k24, k23, t27, k35,
  354. k34, bad, k45, k44,
  355. bad, t37, bad, bad,
  356. };
  357. static int fill_block(InterplayACMContext *s)
  358. {
  359. GetBitContext *gb = &s->gb;
  360. unsigned i, ind;
  361. int ret;
  362. for (i = 0; i < s->cols; i++) {
  363. ind = get_bits(gb, 5);
  364. ret = filler_list[ind](s, ind, i);
  365. if (ret < 0)
  366. return ret;
  367. }
  368. return 0;
  369. }
  370. static void juggle(int *wrap_p, int *block_p, unsigned sub_len, unsigned sub_count)
  371. {
  372. unsigned i, j;
  373. int *p, r0, r1, r2, r3;
  374. for (i = 0; i < sub_len; i++) {
  375. p = block_p;
  376. r0 = wrap_p[0];
  377. r1 = wrap_p[1];
  378. for (j = 0; j < sub_count/2; j++) {
  379. r2 = *p;
  380. *p = r1 * 2 + (r0 + r2);
  381. p += sub_len;
  382. r3 = *p;
  383. *p = r2 * 2 - (r1 + r3);
  384. p += sub_len;
  385. r0 = r2;
  386. r1 = r3;
  387. }
  388. *wrap_p++ = r0;
  389. *wrap_p++ = r1;
  390. block_p++;
  391. }
  392. }
  393. static void juggle_block(InterplayACMContext *s)
  394. {
  395. unsigned sub_count, sub_len, todo_count, step_subcount, i;
  396. int *wrap_p, *block_p, *p;
  397. /* juggle only if subblock_len > 1 */
  398. if (s->level == 0)
  399. return;
  400. /* 2048 / subblock_len */
  401. if (s->level > 9)
  402. step_subcount = 1;
  403. else
  404. step_subcount = (2048 >> s->level) - 2;
  405. /* Apply juggle() (rows)x(cols)
  406. * from (step_subcount * 2) x (subblock_len/2)
  407. * to (step_subcount * subblock_len) x (1)
  408. */
  409. todo_count = s->rows;
  410. block_p = s->block;
  411. while (1) {
  412. wrap_p = s->wrapbuf;
  413. sub_count = step_subcount;
  414. if (sub_count > todo_count)
  415. sub_count = todo_count;
  416. sub_len = s->cols / 2;
  417. sub_count *= 2;
  418. juggle(wrap_p, block_p, sub_len, sub_count);
  419. wrap_p += sub_len * 2;
  420. for (i = 0, p = block_p; i < sub_count; i++) {
  421. p[0]++;
  422. p += sub_len;
  423. }
  424. while (sub_len > 1) {
  425. sub_len /= 2;
  426. sub_count *= 2;
  427. juggle(wrap_p, block_p, sub_len, sub_count);
  428. wrap_p += sub_len * 2;
  429. }
  430. if (todo_count <= step_subcount)
  431. break;
  432. todo_count -= step_subcount;
  433. block_p += step_subcount << s->level;
  434. }
  435. }
  436. static int decode_block(InterplayACMContext *s)
  437. {
  438. GetBitContext *gb = &s->gb;
  439. int pwr, count, val, i, x, ret;
  440. pwr = get_bits(gb, 4);
  441. val = get_bits(gb, 16);
  442. count = 1 << pwr;
  443. for (i = 0, x = 0; i < count; i++) {
  444. s->midbuf[i] = x;
  445. x += val;
  446. }
  447. for (i = 1, x = -val; i <= count; i++) {
  448. s->midbuf[-i] = x;
  449. x -= val;
  450. }
  451. ret = fill_block(s);
  452. if (ret < 0)
  453. return ret;
  454. juggle_block(s);
  455. return 0;
  456. }
  457. static int decode_frame(AVCodecContext *avctx, void *data,
  458. int *got_frame_ptr, AVPacket *pkt)
  459. {
  460. InterplayACMContext *s = avctx->priv_data;
  461. GetBitContext *gb = &s->gb;
  462. AVFrame *frame = data;
  463. const uint8_t *buf;
  464. int16_t *samples;
  465. int ret, n, buf_size, input_buf_size;
  466. if (!pkt->size && !s->bitstream_size) {
  467. *got_frame_ptr = 0;
  468. return 0;
  469. }
  470. buf_size = FFMIN(pkt->size, s->max_framesize - s->bitstream_size);
  471. input_buf_size = buf_size;
  472. if (s->bitstream_index + s->bitstream_size + buf_size > s->max_framesize) {
  473. memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size);
  474. s->bitstream_index = 0;
  475. }
  476. if (pkt->data)
  477. memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], pkt->data, buf_size);
  478. buf = &s->bitstream[s->bitstream_index];
  479. buf_size += s->bitstream_size;
  480. s->bitstream_size = buf_size;
  481. if (buf_size < s->max_framesize && pkt->data) {
  482. *got_frame_ptr = 0;
  483. return input_buf_size;
  484. }
  485. if ((ret = init_get_bits8(gb, buf, buf_size)) < 0)
  486. return ret;
  487. frame->nb_samples = s->block_len / avctx->channels;
  488. if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
  489. return ret;
  490. skip_bits(gb, s->skip);
  491. ret = decode_block(s);
  492. if (ret < 0)
  493. return ret;
  494. samples = (int16_t *)frame->data[0];
  495. for (n = 0; n < frame->nb_samples * avctx->channels; n++) {
  496. int val = s->block[n] >> s->level;
  497. *samples++ = val;
  498. }
  499. *got_frame_ptr = 1;
  500. s->skip = get_bits_count(gb) - 8 * (get_bits_count(gb) / 8);
  501. n = get_bits_count(gb) / 8;
  502. if (n > buf_size && pkt->data) {
  503. s->bitstream_size = 0;
  504. s->bitstream_index = 0;
  505. return AVERROR_INVALIDDATA;
  506. }
  507. if (s->bitstream_size) {
  508. s->bitstream_index += n;
  509. s->bitstream_size -= n;
  510. return input_buf_size;
  511. }
  512. return n;
  513. }
  514. static av_cold int decode_close(AVCodecContext *avctx)
  515. {
  516. InterplayACMContext *s = avctx->priv_data;
  517. av_freep(&s->block);
  518. av_freep(&s->wrapbuf);
  519. av_freep(&s->ampbuf);
  520. av_freep(&s->bitstream);
  521. s->bitstream_size = 0;
  522. return 0;
  523. }
  524. AVCodec ff_interplay_acm_decoder = {
  525. .name = "interplayacm",
  526. .long_name = NULL_IF_CONFIG_SMALL("Interplay ACM"),
  527. .type = AVMEDIA_TYPE_AUDIO,
  528. .id = AV_CODEC_ID_INTERPLAY_ACM,
  529. .init = decode_init,
  530. .close = decode_close,
  531. .decode = decode_frame,
  532. .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1,
  533. .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
  534. .priv_data_size = sizeof(InterplayACMContext),
  535. };