2 * LucasArts VIMA decoder
3 * Copyright (c) 2012 Paul B Mahol
5 * This file is part of FFmpeg.
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.
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.
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
24 * LucasArts VIMA audio decoder
25 * @author Paul B Mahol
28 #include "libavutil/channel_layout.h"
32 #include "adpcm_data.h"
34 static int predict_table_init = 0;
35 static uint16_t predict_table[5786 * 2];
37 static const uint8_t size_table[] =
39 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
40 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
41 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
42 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
43 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
44 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7
47 static const int8_t index_table1[] =
52 static const int8_t index_table2[] =
54 -1, -1, 2, 6, -1, -1, 2, 6
57 static const int8_t index_table3[] =
59 -1, -1, -1, -1, 1, 2, 4, 6,
60 -1, -1, -1, -1, 1, 2, 4, 6
63 static const int8_t index_table4[] =
65 -1, -1, -1, -1, -1, -1, -1, -1,
66 1, 1, 1, 2, 2, 4, 5, 6,
67 -1, -1, -1, -1, -1, -1, -1, -1,
68 1, 1, 1, 2, 2, 4, 5, 6
71 static const int8_t index_table5[] =
73 -1, -1, -1, -1, -1, -1, -1, -1,
74 -1, -1, -1, -1, -1, -1, -1, -1,
75 1, 1, 1, 1, 1, 2, 2, 2,
76 2, 4, 4, 4, 5, 5, 6, 6,
77 -1, -1, -1, -1, -1, -1, -1, -1,
78 -1, -1, -1, -1, -1, -1, -1, -1,
79 1, 1, 1, 1, 1, 2, 2, 2,
80 2, 4, 4, 4, 5, 5, 6, 6
83 static const int8_t index_table6[] =
85 -1, -1, -1, -1, -1, -1, -1, -1,
86 -1, -1, -1, -1, -1, -1, -1, -1,
87 -1, -1, -1, -1, -1, -1, -1, -1,
88 -1, -1, -1, -1, -1, -1, -1, -1,
89 1, 1, 1, 1, 1, 1, 1, 1,
90 1, 1, 2, 2, 2, 2, 2, 2,
91 2, 2, 4, 4, 4, 4, 4, 4,
92 5, 5, 5, 5, 6, 6, 6, 6,
93 -1, -1, -1, -1, -1, -1, -1, -1,
94 -1, -1, -1, -1, -1, -1, -1, -1,
95 -1, -1, -1, -1, -1, -1, -1, -1,
96 -1, -1, -1, -1, -1, -1, -1, -1,
97 1, 1, 1, 1, 1, 1, 1, 1,
98 1, 1, 2, 2, 2, 2, 2, 2,
99 2, 2, 4, 4, 4, 4, 4, 4,
100 5, 5, 5, 5, 6, 6, 6, 6
103 static const int8_t* const step_index_tables[] =
105 index_table1, index_table2, index_table3,
106 index_table4, index_table5, index_table6
109 static av_cold int decode_init(AVCodecContext *avctx)
113 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
115 if (predict_table_init)
118 for (start_pos = 0; start_pos < 64; start_pos++) {
119 unsigned int dest_pos, table_pos;
121 for (table_pos = 0, dest_pos = start_pos;
122 table_pos < FF_ARRAY_ELEMS(ff_adpcm_step_table);
123 table_pos++, dest_pos += 64) {
124 int put = 0, count, table_value;
126 table_value = ff_adpcm_step_table[table_pos];
127 for (count = 32; count != 0; count >>= 1) {
128 if (start_pos & count)
132 predict_table[dest_pos] = put;
135 predict_table_init = 1;
140 static int decode_frame(AVCodecContext *avctx, void *data,
141 int *got_frame_ptr, AVPacket *pkt)
144 AVFrame *frame = data;
147 int8_t channel_hint[2];
148 int ret, chan, channels = 1;
151 return AVERROR_INVALIDDATA;
153 if ((ret = init_get_bits8(&gb, pkt->data, pkt->size)) < 0)
156 samples = get_bits_long(&gb, 32);
157 if (samples == 0xffffffff) {
158 skip_bits_long(&gb, 32);
159 samples = get_bits_long(&gb, 32);
162 if (samples > pkt->size * 2)
163 return AVERROR_INVALIDDATA;
165 channel_hint[0] = get_sbits(&gb, 8);
166 if (channel_hint[0] & 0x80) {
167 channel_hint[0] = ~channel_hint[0];
170 avctx->channels = channels;
171 avctx->channel_layout = (channels == 2) ? AV_CH_LAYOUT_STEREO :
173 pcm_data[0] = get_sbits(&gb, 16);
175 channel_hint[1] = get_sbits(&gb, 8);
176 pcm_data[1] = get_sbits(&gb, 16);
179 frame->nb_samples = samples;
180 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
183 for (chan = 0; chan < channels; chan++) {
184 uint16_t *dest = (uint16_t*)frame->data[0] + chan;
185 int step_index = channel_hint[chan];
186 int output = pcm_data[chan];
189 for (sample = 0; sample < samples; sample++) {
190 int lookup_size, lookup, highbit, lowbits;
192 step_index = av_clip(step_index, 0, 88);
193 lookup_size = size_table[step_index];
194 lookup = get_bits(&gb, lookup_size);
195 highbit = 1 << (lookup_size - 1);
196 lowbits = highbit - 1;
198 if (lookup & highbit)
203 if (lookup == lowbits) {
204 output = get_sbits(&gb, 16);
206 int predict_index, diff;
208 predict_index = (lookup << (7 - lookup_size)) | (step_index << 6);
209 predict_index = av_clip(predict_index, 0, 5785);
210 diff = predict_table[predict_index];
212 diff += ff_adpcm_step_table[step_index] >> (lookup_size - 1);
216 output = av_clip_int16(output + diff);
222 step_index += step_index_tables[lookup_size - 2][lookup];
231 AVCodec ff_vima_decoder = {
233 .type = AVMEDIA_TYPE_AUDIO,
234 .id = AV_CODEC_ID_VIMA,
236 .decode = decode_frame,
237 .capabilities = CODEC_CAP_DR1,
238 .long_name = NULL_IF_CONFIG_SMALL("LucasArts VIMA audio"),