2 * Interplay ACM decoder
4 * Copyright (c) 2004-2008 Marko Kreen
5 * Copyright (c) 2008 Adam Gashlin
6 * Copyright (c) 2015 Paul B Mahol
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.
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.
21 #include "libavutil/intreadwrite.h"
23 #define BITSTREAM_READER_LE
28 static const int8_t map_1bit[] = { -1, +1 };
29 static const int8_t map_2bit_near[] = { -2, -1, +1, +2 };
30 static const int8_t map_2bit_far[] = { -3, -2, +2, +3 };
31 static const int8_t map_3bit[] = { -4, -3, -2, -1, +1, +2, +3, +4 };
33 static int mul_3x3 [3 * 3 * 3];
34 static int mul_3x5 [5 * 5 * 5];
35 static int mul_2x11[11 * 11];
37 typedef struct InterplayACMContext {
55 } InterplayACMContext;
57 static av_cold int decode_init(AVCodecContext *avctx)
59 InterplayACMContext *s = avctx->priv_data;
62 if (avctx->extradata_size < 14)
63 return AVERROR_INVALIDDATA;
65 if (avctx->channels <= 0) {
66 av_log(avctx, AV_LOG_ERROR, "Invalid number of channels: %d\n", avctx->channels);
67 return AVERROR_INVALIDDATA;
70 s->level = AV_RL16(avctx->extradata + 12) & 0xf;
71 s->rows = AV_RL16(avctx->extradata + 12) >> 4;
72 s->cols = 1 << s->level;
73 s->wrapbuf_len = 2 * s->cols - 2;
74 s->block_len = s->rows * s->cols;
75 s->max_framesize = s->block_len;
77 s->block = av_calloc(s->block_len, sizeof(int));
78 s->wrapbuf = av_calloc(s->wrapbuf_len, sizeof(int));
79 s->ampbuf = av_calloc(0x10000, sizeof(int));
80 s->bitstream = av_calloc(s->max_framesize + AV_INPUT_BUFFER_PADDING_SIZE / sizeof(*s->bitstream) + 1, sizeof(*s->bitstream));
81 if (!s->block || !s->wrapbuf || !s->ampbuf || !s->bitstream)
82 return AVERROR(ENOMEM);
84 s->midbuf = s->ampbuf + 0x8000;
85 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
87 for (x3 = 0; x3 < 3; x3++)
88 for (x2 = 0; x2 < 3; x2++)
89 for (x1 = 0; x1 < 3; x1++)
90 mul_3x3[x1 + x2 * 3 + x3* 3 * 3] = x1 + (x2 << 4) + (x3 << 8);
91 for (x3 = 0; x3 < 5; x3++)
92 for (x2 = 0; x2 < 5; x2++)
93 for (x1 = 0; x1 < 5; x1++)
94 mul_3x5[x1 + x2 * 5 + x3 * 5 * 5] = x1 + (x2 << 4) + (x3 << 8);
95 for (x2 = 0; x2 < 11; x2++)
96 for (x1 = 0; x1 < 11; x1++)
97 mul_2x11[x1 + x2 * 11] = x1 + (x2 << 4);
102 #define set_pos(s, r, c, idx) do { \
103 unsigned pos = ((r) << s->level) + (c); \
104 s->block[pos] = s->midbuf[(idx)]; \
107 static int zero(InterplayACMContext *s, unsigned ind, unsigned col)
111 for (i = 0; i < s->rows; i++)
112 set_pos(s, i, col, 0);
116 static int bad(InterplayACMContext *s, unsigned ind, unsigned col)
118 return AVERROR_INVALIDDATA;
121 static int linear(InterplayACMContext *s, unsigned ind, unsigned col)
123 GetBitContext *gb = &s->gb;
125 int b, middle = 1 << (ind - 1);
127 for (i = 0; i < s->rows; i++) {
128 b = get_bits(gb, ind);
129 set_pos(s, i, col, b - middle);
134 static int k13(InterplayACMContext *s, unsigned ind, unsigned col)
136 GetBitContext *gb = &s->gb;
139 for (i = 0; i < s->rows; i++) {
142 set_pos(s, i++, col, 0);
145 set_pos(s, i, col, 0);
150 set_pos(s, i, col, 0);
154 set_pos(s, i, col, map_1bit[b]);
159 static int k12(InterplayACMContext *s, unsigned ind, unsigned col)
161 GetBitContext *gb = &s->gb;
164 for (i = 0; i < s->rows; i++) {
167 set_pos(s, i, col, 0);
172 set_pos(s, i, col, map_1bit[b]);
177 static int k24(InterplayACMContext *s, unsigned ind, unsigned col)
179 GetBitContext *gb = &s->gb;
182 for (i = 0; i < s->rows; i++) {
185 set_pos(s, i++, col, 0);
186 if (i >= s->rows) break;
187 set_pos(s, i, col, 0);
193 set_pos(s, i, col, 0);
198 set_pos(s, i, col, map_2bit_near[b]);
203 static int k23(InterplayACMContext *s, unsigned ind, unsigned col)
205 GetBitContext *gb = &s->gb;
208 for (i = 0; i < s->rows; i++) {
211 set_pos(s, i, col, 0);
216 set_pos(s, i, col, map_2bit_near[b]);
221 static int k35(InterplayACMContext *s, unsigned ind, unsigned col)
223 GetBitContext *gb = &s->gb;
226 for (i = 0; i < s->rows; i++) {
229 set_pos(s, i++, col, 0);
232 set_pos(s, i, col, 0);
238 set_pos(s, i, col, 0);
245 set_pos(s, i, col, map_1bit[b]);
250 set_pos(s, i, col, map_2bit_far[b]);
255 static int k34(InterplayACMContext *s, unsigned ind, unsigned col)
257 GetBitContext *gb = &s->gb;
260 for (i = 0; i < s->rows; i++) {
263 set_pos(s, i, col, 0);
270 set_pos(s, i, col, map_1bit[b]);
275 set_pos(s, i, col, map_2bit_far[b]);
280 static int k45(InterplayACMContext *s, unsigned ind, unsigned col)
282 GetBitContext *gb = &s->gb;
285 for (i = 0; i < s->rows; i++) {
288 set_pos(s, i, col, 0); i++;
291 set_pos(s, i, col, 0);
297 set_pos(s, i, col, 0);
302 set_pos(s, i, col, map_3bit[b]);
307 static int k44(InterplayACMContext *s, unsigned ind, unsigned col)
309 GetBitContext *gb = &s->gb;
312 for (i = 0; i < s->rows; i++) {
315 set_pos(s, i, col, 0);
320 set_pos(s, i, col, map_3bit[b]);
325 static int t15(InterplayACMContext *s, unsigned ind, unsigned col)
327 GetBitContext *gb = &s->gb;
331 for (i = 0; i < s->rows; i++) {
332 /* b = (x1) + (x2 * 3) + (x3 * 9) */
335 av_log(NULL, AV_LOG_ERROR, "Too large b = %d > 26\n", b);
336 return AVERROR_INVALIDDATA;
339 n1 = (mul_3x3[b] & 0x0F) - 1;
340 n2 = ((mul_3x3[b] >> 4) & 0x0F) - 1;
341 n3 = ((mul_3x3[b] >> 8) & 0x0F) - 1;
343 set_pos(s, i++, col, n1);
346 set_pos(s, i++, col, n2);
349 set_pos(s, i, col, n3);
354 static int t27(InterplayACMContext *s, unsigned ind, unsigned col)
356 GetBitContext *gb = &s->gb;
360 for (i = 0; i < s->rows; i++) {
361 /* b = (x1) + (x2 * 5) + (x3 * 25) */
364 av_log(NULL, AV_LOG_ERROR, "Too large b = %d > 124\n", b);
365 return AVERROR_INVALIDDATA;
368 n1 = (mul_3x5[b] & 0x0F) - 2;
369 n2 = ((mul_3x5[b] >> 4) & 0x0F) - 2;
370 n3 = ((mul_3x5[b] >> 8) & 0x0F) - 2;
372 set_pos(s, i++, col, n1);
375 set_pos(s, i++, col, n2);
378 set_pos(s, i, col, n3);
383 static int t37(InterplayACMContext *s, unsigned ind, unsigned col)
385 GetBitContext *gb = &s->gb;
388 for (i = 0; i < s->rows; i++) {
389 /* b = (x1) + (x2 * 11) */
392 av_log(NULL, AV_LOG_ERROR, "Too large b = %d > 120\n", b);
393 return AVERROR_INVALIDDATA;
396 n1 = (mul_2x11[b] & 0x0F) - 5;
397 n2 = ((mul_2x11[b] >> 4) & 0x0F) - 5;
399 set_pos(s, i++, col, n1);
402 set_pos(s, i, col, n2);
407 typedef int (*filler)(InterplayACMContext *s, unsigned ind, unsigned col);
409 static const filler filler_list[] = {
410 zero, bad, bad, linear,
411 linear, linear, linear, linear,
412 linear, linear, linear, linear,
413 linear, linear, linear, linear,
414 linear, k13, k12, t15,
420 static int fill_block(InterplayACMContext *s)
422 GetBitContext *gb = &s->gb;
426 for (i = 0; i < s->cols; i++) {
427 ind = get_bits(gb, 5);
428 ret = filler_list[ind](s, ind, i);
435 static void juggle(int *wrap_p, int *block_p, unsigned sub_len, unsigned sub_count)
438 int *p, r0, r1, r2, r3;
440 for (i = 0; i < sub_len; i++) {
444 for (j = 0; j < sub_count/2; j++) {
446 *p = r1 * 2 + (r0 + r2);
449 *p = r2 * 2 - (r1 + r3);
461 static void juggle_block(InterplayACMContext *s)
463 unsigned sub_count, sub_len, todo_count, step_subcount, i;
464 int *wrap_p, *block_p, *p;
466 /* juggle only if subblock_len > 1 */
470 /* 2048 / subblock_len */
474 step_subcount = (2048 >> s->level) - 2;
476 /* Apply juggle() (rows)x(cols)
477 * from (step_subcount * 2) x (subblock_len/2)
478 * to (step_subcount * subblock_len) x (1)
480 todo_count = s->rows;
484 sub_count = step_subcount;
485 if (sub_count > todo_count)
486 sub_count = todo_count;
488 sub_len = s->cols / 2;
491 juggle(wrap_p, block_p, sub_len, sub_count);
492 wrap_p += sub_len * 2;
494 for (i = 0, p = block_p; i < sub_count; i++) {
499 while (sub_len > 1) {
502 juggle(wrap_p, block_p, sub_len, sub_count);
503 wrap_p += sub_len * 2;
506 if (todo_count <= step_subcount)
509 todo_count -= step_subcount;
510 block_p += step_subcount << s->level;
514 static int decode_block(InterplayACMContext *s)
516 GetBitContext *gb = &s->gb;
517 int pwr, count, val, i, x, ret;
519 pwr = get_bits(gb, 4);
520 val = get_bits(gb, 16);
524 for (i = 0, x = 0; i < count; i++) {
529 for (i = 1, x = -val; i <= count; i++) {
543 static int decode_frame(AVCodecContext *avctx, void *data,
544 int *got_frame_ptr, AVPacket *pkt)
546 InterplayACMContext *s = avctx->priv_data;
547 GetBitContext *gb = &s->gb;
548 AVFrame *frame = data;
551 int ret, n, buf_size, input_buf_size;
553 if (!pkt->size && !s->bitstream_size) {
558 buf_size = FFMIN(pkt->size, s->max_framesize - s->bitstream_size);
559 input_buf_size = buf_size;
560 if (s->bitstream_index + s->bitstream_size + buf_size > s->max_framesize) {
561 memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size);
562 s->bitstream_index = 0;
565 memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], pkt->data, buf_size);
566 buf = &s->bitstream[s->bitstream_index];
567 buf_size += s->bitstream_size;
568 s->bitstream_size = buf_size;
569 if (buf_size < s->max_framesize && pkt->data) {
571 return input_buf_size;
574 if ((ret = init_get_bits8(gb, buf, buf_size)) < 0)
577 frame->nb_samples = s->block_len / avctx->channels;
578 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
581 skip_bits(gb, s->skip);
582 ret = decode_block(s);
586 samples = (int16_t *)frame->data[0];
587 for (n = 0; n < frame->nb_samples * avctx->channels; n++) {
588 int val = s->block[n] >> s->level;
593 s->skip = get_bits_count(gb) - 8 * (get_bits_count(gb) / 8);
594 n = get_bits_count(gb) / 8;
596 if (n > buf_size && pkt->data) {
597 s->bitstream_size = 0;
598 s->bitstream_index = 0;
599 return AVERROR_INVALIDDATA;
602 if (s->bitstream_size) {
603 s->bitstream_index += n;
604 s->bitstream_size -= n;
605 return input_buf_size;
610 static av_cold int decode_close(AVCodecContext *avctx)
612 InterplayACMContext *s = avctx->priv_data;
615 av_freep(&s->wrapbuf);
616 av_freep(&s->ampbuf);
617 av_freep(&s->bitstream);
618 s->bitstream_size = 0;
623 AVCodec ff_interplay_acm_decoder = {
624 .name = "interplayacm",
625 .long_name = NULL_IF_CONFIG_SMALL("Interplay ACM"),
626 .type = AVMEDIA_TYPE_AUDIO,
627 .id = AV_CODEC_ID_INTERPLAY_ACM,
629 .close = decode_close,
630 .decode = decode_frame,
631 .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1,
632 .priv_data_size = sizeof(InterplayACMContext),