1 /*
2 * WavArc audio decoder
3 * Copyright (c) 2023 Paul B Mahol
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
31
34
39
46
51
53 {
55
67
71
73
76 case 16:
s->align *= 2;
78 }
79
82 case MKTAG(
'0',
'C',
'P',
'Y'):
85 break;
86 case MKTAG(
'1',
'D',
'I',
'F'):
89 break;
90 case MKTAG(
'2',
'S',
'L',
'P'):
91 case MKTAG(
'3',
'N',
'L',
'P'):
92 case MKTAG(
'4',
'A',
'L',
'P'):
95 break;
96 default:
98 }
99
100 s->max_framesize =
s->nb_samples * 16;
101 s->bitstream =
av_calloc(
s->max_framesize,
sizeof(*
s->bitstream));
104
105 return 0;
106 }
107
109 {
112 unsigned z = (x << k) | y;
113
114 return z;
115 }
116
118 {
120
121 return (z & 1) ? ~((
int)(z >> 1)) : z >> 1;
122 }
123
125 {
126 const int nb_samples =
s->nb_samples;
127 const int shift =
s->shift;
128
129 if (ch == 0) {
130 if (correlated) {
131 for (
int n = 0; n <
len; n++) {
132 s->samples[0][n] =
s->samples[0][nb_samples + n] >>
shift;
133 s->samples[1][n] =
s->pred[1][n] >>
shift;
134 }
135 } else {
136 for (
int n = 0; n <
len; n++) {
137 s->samples[0][n] =
s->samples[0][nb_samples + n] >>
shift;
138 s->samples[1][n] =
s->pred[0][n] >>
shift;
139 }
140 }
141 } else {
142 if (correlated) {
143 for (int n = 0; n < nb_samples; n++)
144 s->samples[1][n +
len] +=
s->samples[0][n +
len];
145 }
146 for (
int n = 0; n <
len; n++) {
147 s->pred[0][n] =
s->samples[1][nb_samples + n];
148 s->pred[1][n] =
s->pred[0][n] -
s->samples[0][nb_samples + n];
149 }
150 }
151 }
152
155 {
156 const int bits =
s->align * 8;
157
159
162 for (
int n = 0; n <
s->nb_samples; n++) {
164 s->samples[ch][n] =
get_bits(gb, 8) - 0x80;
165 }
166 break;
168 for (
int n = 0; n <
s->nb_samples; n++) {
171 }
172 break;
173 }
174 return 0;
175 }
176
179 {
180 int ch, finished, fill, correlated;
181
182 ch = 0;
183 finished = 0;
184 while (!finished) {
186 int k, block_type;
187
190
192 if (block_type < 4 && block_type >= 0) {
195 if (k > 32)
197 }
198
199 switch (block_type) {
200 case 8:
203 case 7:
205 continue;
206 case 6:
208 continue;
209 case 5:
212 fill -= 0x80;
213 } else {
215 fill -= 0x8000;
216 }
217
218 for (
int n = 0; n <
s->nb_samples; n++)
220 finished = 1;
221 break;
222 case 4:
223 for (
int n = 0; n <
s->nb_samples; n++)
225 finished = 1;
226 break;
227 case 3:
228 for (
int n = 0; n <
s->nb_samples; n++)
231 finished = 1;
232 break;
233 case 2:
234 for (
int n = 0; n <
s->nb_samples; n++)
236 finished = 1;
237 break;
238 case 1:
239 for (
int n = 0; n <
s->nb_samples; n++)
241 finished = 1;
242 break;
243 case 0:
244 for (
int n = 0; n <
s->nb_samples; n++)
246 finished = 1;
247 break;
248 default:
250 }
251
253 if (ch == 0)
255 finished = ch != 0;
257 ch = 1;
258 }
259 }
260
262 for (int n = 0; n < 4; n++)
263 s->samples[0][n] =
s->samples[0][
s->nb_samples + n];
264 }
265
266 return 0;
267 }
268
271 {
272 int ch, finished, fill, correlated, order;
273
274 ch = 0;
275 finished = 0;
276 while (!finished) {
278 int k, block_type;
279
282
284 if (block_type < 5 && block_type >= 0) {
287 if (k > 32)
289 }
290
291 switch (block_type) {
292 case 9:
295 case 8:
297 if (
s->nb_samples > 570) {
300 }
301 continue;
302 case 7:
304 continue;
305 case 6:
308 fill -= 0x80;
309 } else {
311 fill -= 0x8000;
312 }
313
314 for (
int n = 0; n <
s->nb_samples; n++)
316 finished = 1;
317 break;
318 case 5:
319 for (
int n = 0; n <
s->nb_samples; n++)
321 finished = 1;
322 break;
323 case 4:
324 for (
int n = 0; n <
s->nb_samples; n++)
327 finished = 1;
328 break;
329 case 3:
330 for (
int n = 0; n <
s->nb_samples; n++)
332 finished = 1;
333 break;
334 case 2:
335 for (
int n = 0; n <
s->nb_samples; n++)
337 finished = 1;
338 break;
339 case 1:
340 for (
int n = 0; n <
s->nb_samples; n++)
342 finished = 1;
343 break;
344 case 0:
346 for (int o = 0; o < order; o++)
348 for (
int n = 0; n <
s->nb_samples; n++) {
349 int sum = 15;
350
351 for (int o = 0; o < order; o++)
352 sum +=
s->filter[ch][o] *
samples[n + 70 - o - 1];
353
355 }
356 finished = 1;
357 break;
358 default:
360 }
361
363 if (ch == 0)
365 finished = ch != 0;
367 ch = 1;
368 }
369 }
370
372 for (int n = 0; n < 70; n++)
373 s->samples[0][n] =
s->samples[0][
s->nb_samples + n];
374 }
375
376 return 0;
377 }
378
381 {
384 int buf_size, input_buf_size;
385 const uint8_t *buf;
387
388 if ((!
pkt->
size && !
s->bitstream_size) ||
s->nb_samples == 0 ||
s->eof) {
389 *got_frame_ptr = 0;
391 }
392
393 buf_size =
FFMIN(
pkt->
size,
s->max_framesize -
s->bitstream_size);
394 input_buf_size = buf_size;
396 memmove(
s->bitstream, &
s->bitstream[
s->bitstream_index],
s->bitstream_size);
397 s->bitstream_index = 0;
398 }
400 memcpy(&
s->bitstream[
s->bitstream_index +
s->bitstream_size],
pkt->
data, buf_size);
401 buf = &
s->bitstream[
s->bitstream_index];
402 buf_size +=
s->bitstream_size;
403 s->bitstream_size = buf_size;
404 if (buf_size < s->max_framesize &&
pkt->
data) {
405 *got_frame_ptr = 0;
406 return input_buf_size;
407 }
408
412
414 case MKTAG(
'0',
'C',
'P',
'Y'):
416 break;
417 case MKTAG(
'1',
'D',
'I',
'F'):
419 break;
420 case MKTAG(
'2',
'S',
'L',
'P'):
421 case MKTAG(
'3',
'N',
'L',
'P'):
422 case MKTAG(
'4',
'A',
'L',
'P'):
424 break;
425 default:
427 }
428
431
434
435 if (n > buf_size) {
437 s->bitstream_size = 0;
438 s->bitstream_index = 0;
440 return 0;
442 }
443
444 frame->nb_samples =
s->nb_samples;
447
451 uint8_t *dst = (uint8_t *)
frame->extended_data[ch];
452 const int *
src =
s->samples[ch] +
s->offset;
453
454 for (
int n = 0; n <
frame->nb_samples; n++)
455 dst[n] =
src[n] * (1 <<
s->shift) + 0x80
U;
456 }
457 break;
460 int16_t *dst = (int16_t *)
frame->extended_data[ch];
461 const int *
src =
s->samples[ch] +
s->offset;
462
463 for (
int n = 0; n <
frame->nb_samples; n++)
464 dst[n] =
src[n] * (1 <<
s->shift);
465 }
466 break;
467 }
468
469 *got_frame_ptr = 1;
470
471 if (
s->bitstream_size) {
472 s->bitstream_index += n;
473 s->bitstream_size -= n;
474 return input_buf_size;
475 }
476
477 return n;
478 }
479
481 {
483
485 s->bitstream_size = 0;
486
487 return 0;
488 }
489
505 };