]> git.sesse.net Git - ffmpeg/blob - libavcodec/flacdec.c
488f14fdef9f5e0986005aad3c5a8897f90d5d1d
[ffmpeg] / libavcodec / flacdec.c
1 /*
2  * FLAC (Free Lossless Audio Codec) decoder
3  * Copyright (c) 2003 Alex Beregszaszi
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
22 /**
23  * @file flacdec.c
24  * FLAC (Free Lossless Audio Codec) decoder
25  * @author Alex Beregszaszi
26  *
27  * For more information on the FLAC format, visit:
28  *  http://flac.sourceforge.net/
29  *
30  * This decoder can be used in 1 of 2 ways: Either raw FLAC data can be fed
31  * through, starting from the initial 'fLaC' signature; or by passing the
32  * 34-byte streaminfo structure through avctx->extradata[_size] followed
33  * by data starting with the 0xFFF8 marker.
34  */
35
36 #include <limits.h>
37
38 #define ALT_BITSTREAM_READER
39 #include "libavutil/crc.h"
40 #include "avcodec.h"
41 #include "bitstream.h"
42 #include "golomb.h"
43 #include "flac.h"
44
45 #undef NDEBUG
46 #include <assert.h>
47
48 #define MAX_CHANNELS 8
49 #define MAX_BLOCKSIZE 65535
50 #define FLAC_STREAMINFO_SIZE 34
51
52 enum decorrelation_type {
53     INDEPENDENT,
54     LEFT_SIDE,
55     RIGHT_SIDE,
56     MID_SIDE,
57 };
58
59 typedef struct FLACContext {
60     FLACSTREAMINFO
61
62     AVCodecContext *avctx;
63     GetBitContext gb;
64
65     int blocksize/*, last_blocksize*/;
66     int curr_bps;
67     enum decorrelation_type decorrelation;
68
69     int32_t *decoded[MAX_CHANNELS];
70     uint8_t *bitstream;
71     unsigned int bitstream_size;
72     unsigned int bitstream_index;
73     unsigned int allocated_bitstream_size;
74 } FLACContext;
75
76 #define METADATA_TYPE_STREAMINFO 0
77
78 static const int sample_rate_table[] =
79 { 0,
80   88200, 176400, 192000,
81   8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000,
82   0, 0, 0, 0 };
83
84 static const int sample_size_table[] =
85 { 0, 8, 12, 0, 16, 20, 24, 0 };
86
87 static const int blocksize_table[] = {
88      0,    192, 576<<0, 576<<1, 576<<2, 576<<3,      0,      0,
89 256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7
90 };
91
92 static int64_t get_utf8(GetBitContext *gb)
93 {
94     int64_t val;
95     GET_UTF8(val, get_bits(gb, 8), return -1;)
96     return val;
97 }
98
99 static void allocate_buffers(FLACContext *s);
100 static int metadata_parse(FLACContext *s);
101
102 static av_cold int flac_decode_init(AVCodecContext *avctx)
103 {
104     FLACContext *s = avctx->priv_data;
105     s->avctx = avctx;
106
107     if (avctx->extradata_size > 4) {
108         /* initialize based on the demuxer-supplied streamdata header */
109         if (avctx->extradata_size == FLAC_STREAMINFO_SIZE) {
110             ff_flac_parse_streaminfo(avctx, (FLACStreaminfo *)s, avctx->extradata);
111             allocate_buffers(s);
112         } else {
113             init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
114             metadata_parse(s);
115         }
116     }
117
118     avctx->sample_fmt = SAMPLE_FMT_S16;
119     return 0;
120 }
121
122 static void dump_headers(AVCodecContext *avctx, FLACStreaminfo *s)
123 {
124     av_log(avctx, AV_LOG_DEBUG, "  Blocksize: %d .. %d\n", s->min_blocksize, s->max_blocksize);
125     av_log(avctx, AV_LOG_DEBUG, "  Max Framesize: %d\n", s->max_framesize);
126     av_log(avctx, AV_LOG_DEBUG, "  Samplerate: %d\n", s->samplerate);
127     av_log(avctx, AV_LOG_DEBUG, "  Channels: %d\n", s->channels);
128     av_log(avctx, AV_LOG_DEBUG, "  Bits: %d\n", s->bps);
129 }
130
131 static void allocate_buffers(FLACContext *s)
132 {
133     int i;
134
135     assert(s->max_blocksize);
136
137     if (s->max_framesize == 0 && s->max_blocksize) {
138         s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; //FIXME header overhead
139     }
140
141     for (i = 0; i < s->channels; i++) {
142         s->decoded[i] = av_realloc(s->decoded[i], sizeof(int32_t)*s->max_blocksize);
143     }
144
145     if (s->allocated_bitstream_size < s->max_framesize)
146         s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
147 }
148
149 void ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s,
150                               const uint8_t *buffer)
151 {
152     GetBitContext gb;
153     init_get_bits(&gb, buffer, FLAC_STREAMINFO_SIZE*8);
154
155     /* mandatory streaminfo */
156     s->min_blocksize = get_bits(&gb, 16);
157     s->max_blocksize = get_bits(&gb, 16);
158
159     skip_bits(&gb, 24); /* skip min frame size */
160     s->max_framesize = get_bits_long(&gb, 24);
161
162     s->samplerate = get_bits_long(&gb, 20);
163     s->channels = get_bits(&gb, 3) + 1;
164     s->bps = get_bits(&gb, 5) + 1;
165
166     avctx->channels = s->channels;
167     avctx->sample_rate = s->samplerate;
168
169     skip_bits(&gb, 36); /* total num of samples */
170
171     skip_bits(&gb, 64); /* md5 sum */
172     skip_bits(&gb, 64); /* md5 sum */
173
174     dump_headers(avctx, s);
175 }
176
177 /**
178  * Parse a list of metadata blocks. This list of blocks must begin with
179  * the fLaC marker.
180  * @param s the flac decoding context containing the gb bit reader used to
181  *          parse metadata
182  * @return 1 if some metadata was read, 0 if no fLaC marker was found
183  */
184 static int metadata_parse(FLACContext *s)
185 {
186     int i, metadata_last, metadata_type, metadata_size, streaminfo_updated=0;
187     int initial_pos= get_bits_count(&s->gb);
188
189     if (show_bits_long(&s->gb, 32) == MKBETAG('f','L','a','C')) {
190         skip_bits(&s->gb, 32);
191
192         do {
193             metadata_last = get_bits1(&s->gb);
194             metadata_type = get_bits(&s->gb, 7);
195             metadata_size = get_bits_long(&s->gb, 24);
196
197             if (get_bits_count(&s->gb) + 8*metadata_size > s->gb.size_in_bits) {
198                 skip_bits_long(&s->gb, initial_pos - get_bits_count(&s->gb));
199                 break;
200             }
201
202             if (metadata_size) {
203                 switch (metadata_type) {
204                 case METADATA_TYPE_STREAMINFO:
205                     ff_flac_parse_streaminfo(s->avctx, (FLACStreaminfo *)s, s->gb.buffer+get_bits_count(&s->gb)/8);
206                     streaminfo_updated = 1;
207
208                 default:
209                     for (i = 0; i < metadata_size; i++)
210                         skip_bits(&s->gb, 8);
211                 }
212             }
213         } while (!metadata_last);
214
215         if (streaminfo_updated)
216             allocate_buffers(s);
217         return 1;
218     }
219     return 0;
220 }
221
222 static int decode_residuals(FLACContext *s, int channel, int pred_order)
223 {
224     int i, tmp, partition, method_type, rice_order;
225     int sample = 0, samples;
226
227     method_type = get_bits(&s->gb, 2);
228     if (method_type > 1) {
229         av_log(s->avctx, AV_LOG_ERROR, "illegal residual coding method %d\n", method_type);
230         return -1;
231     }
232
233     rice_order = get_bits(&s->gb, 4);
234
235     samples= s->blocksize >> rice_order;
236     if (pred_order > samples) {
237         av_log(s->avctx, AV_LOG_ERROR, "invalid predictor order: %i > %i\n", pred_order, samples);
238         return -1;
239     }
240
241     sample=
242     i= pred_order;
243     for (partition = 0; partition < (1 << rice_order); partition++) {
244         tmp = get_bits(&s->gb, method_type == 0 ? 4 : 5);
245         if (tmp == (method_type == 0 ? 15 : 31)) {
246             tmp = get_bits(&s->gb, 5);
247             for (; i < samples; i++, sample++)
248                 s->decoded[channel][sample] = get_sbits(&s->gb, tmp);
249         } else {
250             for (; i < samples; i++, sample++) {
251                 s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0);
252             }
253         }
254         i= 0;
255     }
256
257     return 0;
258 }
259
260 static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order)
261 {
262     const int blocksize = s->blocksize;
263     int32_t *decoded = s->decoded[channel];
264     int a, b, c, d, i;
265
266     /* warm up samples */
267     for (i = 0; i < pred_order; i++) {
268         decoded[i] = get_sbits(&s->gb, s->curr_bps);
269     }
270
271     if (decode_residuals(s, channel, pred_order) < 0)
272         return -1;
273
274     if (pred_order > 0)
275         a = decoded[pred_order-1];
276     if (pred_order > 1)
277         b = a - decoded[pred_order-2];
278     if (pred_order > 2)
279         c = b - decoded[pred_order-2] + decoded[pred_order-3];
280     if (pred_order > 3)
281         d = c - decoded[pred_order-2] + 2*decoded[pred_order-3] - decoded[pred_order-4];
282
283     switch (pred_order) {
284     case 0:
285         break;
286     case 1:
287         for (i = pred_order; i < blocksize; i++)
288             decoded[i] = a += decoded[i];
289         break;
290     case 2:
291         for (i = pred_order; i < blocksize; i++)
292             decoded[i] = a += b += decoded[i];
293         break;
294     case 3:
295         for (i = pred_order; i < blocksize; i++)
296             decoded[i] = a += b += c += decoded[i];
297         break;
298     case 4:
299         for (i = pred_order; i < blocksize; i++)
300             decoded[i] = a += b += c += d += decoded[i];
301         break;
302     default:
303         av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order);
304         return -1;
305     }
306
307     return 0;
308 }
309
310 static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order)
311 {
312     int i, j;
313     int coeff_prec, qlevel;
314     int coeffs[pred_order];
315     int32_t *decoded = s->decoded[channel];
316
317     /* warm up samples */
318     for (i = 0; i < pred_order; i++) {
319         decoded[i] = get_sbits(&s->gb, s->curr_bps);
320     }
321
322     coeff_prec = get_bits(&s->gb, 4) + 1;
323     if (coeff_prec == 16) {
324         av_log(s->avctx, AV_LOG_ERROR, "invalid coeff precision\n");
325         return -1;
326     }
327     qlevel = get_sbits(&s->gb, 5);
328     if (qlevel < 0) {
329         av_log(s->avctx, AV_LOG_ERROR, "qlevel %d not supported, maybe buggy stream\n", qlevel);
330         return -1;
331     }
332
333     for (i = 0; i < pred_order; i++) {
334         coeffs[i] = get_sbits(&s->gb, coeff_prec);
335     }
336
337     if (decode_residuals(s, channel, pred_order) < 0)
338         return -1;
339
340     if (s->bps > 16) {
341         int64_t sum;
342         for (i = pred_order; i < s->blocksize; i++) {
343             sum = 0;
344             for (j = 0; j < pred_order; j++)
345                 sum += (int64_t)coeffs[j] * decoded[i-j-1];
346             decoded[i] += sum >> qlevel;
347         }
348     } else {
349         for (i = pred_order; i < s->blocksize-1; i += 2) {
350             int c;
351             int d = decoded[i-pred_order];
352             int s0 = 0, s1 = 0;
353             for (j = pred_order-1; j > 0; j--) {
354                 c = coeffs[j];
355                 s0 += c*d;
356                 d = decoded[i-j];
357                 s1 += c*d;
358             }
359             c = coeffs[0];
360             s0 += c*d;
361             d = decoded[i] += s0 >> qlevel;
362             s1 += c*d;
363             decoded[i+1] += s1 >> qlevel;
364         }
365         if (i < s->blocksize) {
366             int sum = 0;
367             for (j = 0; j < pred_order; j++)
368                 sum += coeffs[j] * decoded[i-j-1];
369             decoded[i] += sum >> qlevel;
370         }
371     }
372
373     return 0;
374 }
375
376 static inline int decode_subframe(FLACContext *s, int channel)
377 {
378     int type, wasted = 0;
379     int i, tmp;
380
381     s->curr_bps = s->bps;
382     if (channel == 0) {
383         if (s->decorrelation == RIGHT_SIDE)
384             s->curr_bps++;
385     } else {
386         if (s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE)
387             s->curr_bps++;
388     }
389
390     if (get_bits1(&s->gb)) {
391         av_log(s->avctx, AV_LOG_ERROR, "invalid subframe padding\n");
392         return -1;
393     }
394     type = get_bits(&s->gb, 6);
395
396     if (get_bits1(&s->gb)) {
397         wasted = 1;
398         while (!get_bits1(&s->gb))
399             wasted++;
400         s->curr_bps -= wasted;
401     }
402
403 //FIXME use av_log2 for types
404     if (type == 0) {
405         tmp = get_sbits(&s->gb, s->curr_bps);
406         for (i = 0; i < s->blocksize; i++)
407             s->decoded[channel][i] = tmp;
408     } else if (type == 1) {
409         for (i = 0; i < s->blocksize; i++)
410             s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
411     } else if ((type >= 8) && (type <= 12)) {
412         if (decode_subframe_fixed(s, channel, type & ~0x8) < 0)
413             return -1;
414     } else if (type >= 32) {
415         if (decode_subframe_lpc(s, channel, (type & ~0x20)+1) < 0)
416             return -1;
417     } else {
418         av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n");
419         return -1;
420     }
421
422     if (wasted) {
423         int i;
424         for (i = 0; i < s->blocksize; i++)
425             s->decoded[channel][i] <<= wasted;
426     }
427
428     return 0;
429 }
430
431 static int decode_frame(FLACContext *s, int alloc_data_size)
432 {
433     int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8;
434     int decorrelation, bps, blocksize, samplerate;
435
436     blocksize_code = get_bits(&s->gb, 4);
437
438     sample_rate_code = get_bits(&s->gb, 4);
439
440     assignment = get_bits(&s->gb, 4); /* channel assignment */
441     if (assignment < 8 && s->channels == assignment+1)
442         decorrelation = INDEPENDENT;
443     else if (assignment >=8 && assignment < 11 && s->channels == 2)
444         decorrelation = LEFT_SIDE + assignment - 8;
445     else {
446         av_log(s->avctx, AV_LOG_ERROR, "unsupported channel assignment %d (channels=%d)\n", assignment, s->channels);
447         return -1;
448     }
449
450     sample_size_code = get_bits(&s->gb, 3);
451     if (sample_size_code == 0)
452         bps= s->bps;
453     else if ((sample_size_code != 3) && (sample_size_code != 7))
454         bps = sample_size_table[sample_size_code];
455     else {
456         av_log(s->avctx, AV_LOG_ERROR, "invalid sample size code (%d)\n", sample_size_code);
457         return -1;
458     }
459
460     if (get_bits1(&s->gb)) {
461         av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n");
462         return -1;
463     }
464
465     if (get_utf8(&s->gb) < 0) {
466         av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
467         return -1;
468     }
469
470     if (blocksize_code == 0)
471         blocksize = s->min_blocksize;
472     else if (blocksize_code == 6)
473         blocksize = get_bits(&s->gb, 8)+1;
474     else if (blocksize_code == 7)
475         blocksize = get_bits(&s->gb, 16)+1;
476     else
477         blocksize = blocksize_table[blocksize_code];
478
479     if (blocksize > s->max_blocksize) {
480         av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize, s->max_blocksize);
481         return -1;
482     }
483
484     if (blocksize * s->channels * sizeof(int16_t) > alloc_data_size)
485         return -1;
486
487     if (sample_rate_code == 0)
488         samplerate= s->samplerate;
489     else if (sample_rate_code < 12)
490         samplerate = sample_rate_table[sample_rate_code];
491     else if (sample_rate_code == 12)
492         samplerate = get_bits(&s->gb, 8) * 1000;
493     else if (sample_rate_code == 13)
494         samplerate = get_bits(&s->gb, 16);
495     else if (sample_rate_code == 14)
496         samplerate = get_bits(&s->gb, 16) * 10;
497     else {
498         av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code);
499         return -1;
500     }
501
502     skip_bits(&s->gb, 8);
503     crc8 = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0,
504                   s->gb.buffer, get_bits_count(&s->gb)/8);
505     if (crc8) {
506         av_log(s->avctx, AV_LOG_ERROR, "header crc mismatch crc=%2X\n", crc8);
507         return -1;
508     }
509
510     s->blocksize    = blocksize;
511     s->samplerate   = samplerate;
512     s->bps          = bps;
513     s->decorrelation= decorrelation;
514
515 //    dump_headers(s->avctx, (FLACStreaminfo *)s);
516
517     /* subframes */
518     for (i = 0; i < s->channels; i++) {
519         if (decode_subframe(s, i) < 0)
520             return -1;
521     }
522
523     align_get_bits(&s->gb);
524
525     /* frame footer */
526     skip_bits(&s->gb, 16); /* data crc */
527
528     return 0;
529 }
530
531 static int flac_decode_frame(AVCodecContext *avctx,
532                             void *data, int *data_size,
533                             const uint8_t *buf, int buf_size)
534 {
535     FLACContext *s = avctx->priv_data;
536     int tmp = 0, i, j = 0, input_buf_size = 0;
537     int16_t *samples = data;
538     int alloc_data_size= *data_size;
539
540     *data_size=0;
541
542     if (s->max_framesize == 0) {
543         s->max_framesize= FFMAX(4, buf_size); // should hopefully be enough for the first header
544         s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
545     }
546
547     if (1 && s->max_framesize) { //FIXME truncated
548             if (s->bitstream_size < 4 || AV_RL32(s->bitstream) != MKTAG('f','L','a','C'))
549                 buf_size= FFMIN(buf_size, s->max_framesize - FFMIN(s->bitstream_size, s->max_framesize));
550             input_buf_size= buf_size;
551
552             if (s->bitstream_size + buf_size < buf_size || s->bitstream_index + s->bitstream_size + buf_size < s->bitstream_index)
553                 return -1;
554
555             if (s->allocated_bitstream_size < s->bitstream_size + buf_size)
556                 s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->bitstream_size + buf_size);
557
558             if (s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size) {
559                 memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size);
560                 s->bitstream_index=0;
561             }
562             memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size);
563             buf= &s->bitstream[s->bitstream_index];
564             buf_size += s->bitstream_size;
565             s->bitstream_size= buf_size;
566
567             if (buf_size < s->max_framesize && input_buf_size) {
568                 return input_buf_size;
569             }
570     }
571
572     init_get_bits(&s->gb, buf, buf_size*8);
573
574     if (metadata_parse(s))
575         goto end;
576
577     tmp = show_bits(&s->gb, 16);
578     if ((tmp & 0xFFFE) != 0xFFF8) {
579         av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n");
580         while (get_bits_count(&s->gb)/8+2 < buf_size && (show_bits(&s->gb, 16) & 0xFFFE) != 0xFFF8)
581             skip_bits(&s->gb, 8);
582         goto end; // we may not have enough bits left to decode a frame, so try next time
583     }
584     skip_bits(&s->gb, 16);
585     if (decode_frame(s, alloc_data_size) < 0) {
586         av_log(s->avctx, AV_LOG_ERROR, "decode_frame() failed\n");
587         s->bitstream_size=0;
588         s->bitstream_index=0;
589         return -1;
590     }
591
592 #define DECORRELATE(left, right)\
593             assert(s->channels == 2);\
594             for (i = 0; i < s->blocksize; i++) {\
595                 int a= s->decoded[0][i];\
596                 int b= s->decoded[1][i];\
597                 *samples++ = ((left)  << (24 - s->bps)) >> 8;\
598                 *samples++ = ((right) << (24 - s->bps)) >> 8;\
599             }\
600             break;
601
602     switch (s->decorrelation) {
603     case INDEPENDENT:
604         for (j = 0; j < s->blocksize; j++) {
605             for (i = 0; i < s->channels; i++)
606                 *samples++ = (s->decoded[i][j] << (24 - s->bps)) >> 8;
607         }
608         break;
609     case LEFT_SIDE:
610         DECORRELATE(a,a-b)
611     case RIGHT_SIDE:
612         DECORRELATE(a+b,b)
613     case MID_SIDE:
614         DECORRELATE( (a-=b>>1) + b, a)
615     }
616
617     *data_size = (int8_t *)samples - (int8_t *)data;
618
619 end:
620     i= (get_bits_count(&s->gb)+7)/8;
621     if (i > buf_size) {
622         av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", i - buf_size);
623         s->bitstream_size=0;
624         s->bitstream_index=0;
625         return -1;
626     }
627
628     if (s->bitstream_size) {
629         s->bitstream_index += i;
630         s->bitstream_size  -= i;
631         return input_buf_size;
632     } else
633         return i;
634 }
635
636 static av_cold int flac_decode_close(AVCodecContext *avctx)
637 {
638     FLACContext *s = avctx->priv_data;
639     int i;
640
641     for (i = 0; i < s->channels; i++) {
642         av_freep(&s->decoded[i]);
643     }
644     av_freep(&s->bitstream);
645
646     return 0;
647 }
648
649 static void flac_flush(AVCodecContext *avctx)
650 {
651     FLACContext *s = avctx->priv_data;
652
653     s->bitstream_size=
654     s->bitstream_index= 0;
655 }
656
657 AVCodec flac_decoder = {
658     "flac",
659     CODEC_TYPE_AUDIO,
660     CODEC_ID_FLAC,
661     sizeof(FLACContext),
662     flac_decode_init,
663     NULL,
664     flac_decode_close,
665     flac_decode_frame,
666     CODEC_CAP_DELAY,
667     .flush= flac_flush,
668     .long_name= NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
669 };