51 count1table_select = 0x01,
52 scalefac_scale = 0x02,
54 mixed_block_flag = 0x08
63 unsigned int main_data_begin;
64 unsigned int private_bits;
66 unsigned char scfsi[2];
71 unsigned short part2_3_length;
72 unsigned short big_values;
73 unsigned short global_gain;
74 unsigned short scalefac_compress;
77 unsigned char block_type;
78 unsigned char table_select[3];
79 unsigned char subblock_gain[3];
80 unsigned char region0_count;
81 unsigned char region1_count;
84 unsigned char scalefac[39];
97}
const sflen_table[16] = {
98 { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 },
99 { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 },
100 { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 },
101 { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 }
109unsigned char const nsfb_table[6][3][4] = {
140unsigned char const sfb_48000_long[] = {
141 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10,
142 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192
146unsigned char const sfb_44100_long[] = {
147 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10,
148 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158
152unsigned char const sfb_32000_long[] = {
153 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12,
154 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26
158unsigned char const sfb_48000_short[] = {
159 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
160 6, 6, 6, 6, 6, 10, 10, 10, 12, 12, 12, 14, 14,
161 14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
165unsigned char const sfb_44100_short[] = {
166 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
167 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14,
168 14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
172unsigned char const sfb_32000_short[] = {
173 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
174 6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20,
175 20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
179unsigned char const sfb_48000_mixed[] = {
180 4, 4, 4, 4, 4, 4, 6, 6,
181 4, 4, 4, 6, 6, 6, 6, 6, 6, 10,
182 10, 10, 12, 12, 12, 14, 14, 14, 16, 16,
183 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
187unsigned char const sfb_44100_mixed[] = {
188 4, 4, 4, 4, 4, 4, 6, 6,
189 4, 4, 4, 6, 6, 6, 8, 8, 8, 10,
190 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
191 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
195unsigned char const sfb_32000_mixed[] = {
196 4, 4, 4, 4, 4, 4, 6, 6,
197 4, 4, 4, 6, 6, 6, 8, 8, 8, 12,
198 12, 12, 16, 16, 16, 20, 20, 20, 26, 26,
199 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
207unsigned char const sfb_24000_long[] = {
208 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
209 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36
213unsigned char const sfb_22050_long[] = {
214 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
215 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54
218# define sfb_16000_long sfb_22050_long
221unsigned char const sfb_24000_short[] = {
222 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8,
223 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
224 18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12
228unsigned char const sfb_22050_short[] = {
229 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6,
230 6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18,
231 18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18
235unsigned char const sfb_16000_short[] = {
236 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8,
237 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
238 18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18
242unsigned char const sfb_24000_mixed[] = {
244 6, 6, 6, 8, 8, 8, 10, 10, 10, 12,
245 12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
246 24, 32, 32, 32, 44, 44, 44, 12, 12, 12
250unsigned char const sfb_22050_mixed[] = {
252 6, 6, 6, 6, 6, 6, 8, 8, 8, 10,
253 10, 10, 14, 14, 14, 18, 18, 18, 26, 26,
254 26, 32, 32, 32, 42, 42, 42, 18, 18, 18
258unsigned char const sfb_16000_mixed[] = {
260 6, 6, 6, 8, 8, 8, 10, 10, 10, 12,
261 12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
262 24, 30, 30, 30, 40, 40, 40, 18, 18, 18
269# define sfb_12000_long sfb_16000_long
270# define sfb_11025_long sfb_12000_long
273unsigned char const sfb_8000_long[] = {
274 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32,
275 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2
278# define sfb_12000_short sfb_16000_short
279# define sfb_11025_short sfb_12000_short
282unsigned char const sfb_8000_short[] = {
283 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16,
284 16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36,
285 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26
288# define sfb_12000_mixed sfb_16000_mixed
289# define sfb_11025_mixed sfb_12000_mixed
294unsigned char const sfb_8000_mixed[] = {
296 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16,
297 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36,
298 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26
303 unsigned char const *l;
304 unsigned char const *s;
305 unsigned char const *m;
306}
const sfbwidth_table[9] = {
307 { sfb_48000_long, sfb_48000_short, sfb_48000_mixed },
308 { sfb_44100_long, sfb_44100_short, sfb_44100_mixed },
309 { sfb_32000_long, sfb_32000_short, sfb_32000_mixed },
310 { sfb_24000_long, sfb_24000_short, sfb_24000_mixed },
311 { sfb_22050_long, sfb_22050_short, sfb_22050_mixed },
312 { sfb_16000_long, sfb_16000_short, sfb_16000_mixed },
313 { sfb_12000_long, sfb_12000_short, sfb_12000_mixed },
314 { sfb_11025_long, sfb_11025_short, sfb_11025_mixed },
315 { sfb_8000_long, sfb_8000_short, sfb_8000_mixed }
323unsigned char const pretab[22] = {
324 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
334 unsigned long mantissa : 27;
335 unsigned short exponent : 5;
336}
const rq_table[8207] = {
337# include "rq_table.dat"
347mad_fixed_t
const root_table[7] = {
366mad_fixed_t
const cs[8] = {
367 +MAD_F(0x0db84a81) , +MAD_F(0x0e1b9d7f) ,
368 +MAD_F(0x0f31adcf) , +MAD_F(0x0fbba815) ,
369 +MAD_F(0x0feda417) , +MAD_F(0x0ffc8fc8) ,
370 +MAD_F(0x0fff964c) , +MAD_F(0x0ffff8d3)
374mad_fixed_t
const ca[8] = {
375 -MAD_F(0x083b5fe7) , -MAD_F(0x078c36d2) ,
376 -MAD_F(0x05039814) , -MAD_F(0x02e91dd1) ,
377 -MAD_F(0x0183603a) , -MAD_F(0x00a7cb87) ,
378 -MAD_F(0x003a2847) , -MAD_F(0x000f27b4)
389mad_fixed_t
const imdct_s[6][6] = {
390# include "imdct_s.dat"
393# if !defined(ASO_IMDCT)
401mad_fixed_t
const window_l[36] = {
402 MAD_F(0x00b2aa3e) , MAD_F(0x0216a2a2) ,
403 MAD_F(0x03768962) , MAD_F(0x04cfb0e2) ,
404 MAD_F(0x061f78aa) , MAD_F(0x07635284) ,
405 MAD_F(0x0898c779) , MAD_F(0x09bd7ca0) ,
406 MAD_F(0x0acf37ad) , MAD_F(0x0bcbe352) ,
407 MAD_F(0x0cb19346) , MAD_F(0x0d7e8807) ,
409 MAD_F(0x0e313245) , MAD_F(0x0ec835e8) ,
410 MAD_F(0x0f426cb5) , MAD_F(0x0f9ee890) ,
411 MAD_F(0x0fdcf549) , MAD_F(0x0ffc19fd) ,
412 MAD_F(0x0ffc19fd) , MAD_F(0x0fdcf549) ,
413 MAD_F(0x0f9ee890) , MAD_F(0x0f426cb5) ,
414 MAD_F(0x0ec835e8) , MAD_F(0x0e313245) ,
416 MAD_F(0x0d7e8807) , MAD_F(0x0cb19346) ,
417 MAD_F(0x0bcbe352) , MAD_F(0x0acf37ad) ,
418 MAD_F(0x09bd7ca0) , MAD_F(0x0898c779) ,
419 MAD_F(0x07635284) , MAD_F(0x061f78aa) ,
420 MAD_F(0x04cfb0e2) , MAD_F(0x03768962) ,
421 MAD_F(0x0216a2a2) , MAD_F(0x00b2aa3e) ,
432mad_fixed_t
const window_s[12] = {
433 MAD_F(0x0216a2a2) , MAD_F(0x061f78aa) ,
434 MAD_F(0x09bd7ca0) , MAD_F(0x0cb19346) ,
435 MAD_F(0x0ec835e8) , MAD_F(0x0fdcf549) ,
436 MAD_F(0x0fdcf549) , MAD_F(0x0ec835e8) ,
437 MAD_F(0x0cb19346) , MAD_F(0x09bd7ca0) ,
438 MAD_F(0x061f78aa) , MAD_F(0x0216a2a2) ,
449mad_fixed_t
const is_table[7] = {
467mad_fixed_t
const is_lsf_table[2][15] = {
508enum mad_error III_sideinfo(
struct mad_bitptr *ptr,
unsigned int nch,
510 unsigned int *data_bitlen,
511 unsigned int *priv_bitlen)
513 unsigned int ngr, gr, ch, i;
514 enum mad_error result = MAD_ERROR_NONE;
517 *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3);
519 si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9);
520 si->private_bits = mad_bit_read(ptr, *priv_bitlen);
526 for (ch = 0; ch < nch; ++ch)
527 si->scfsi[ch] = mad_bit_read(ptr, 4);
530 for (gr = 0; gr < ngr; ++gr) {
531 struct granule *granule = &si->gr[gr];
533 for (ch = 0; ch < nch; ++ch) {
534 struct channel *channel = &granule->ch[ch];
536 channel->part2_3_length = mad_bit_read(ptr, 12);
537 channel->big_values = mad_bit_read(ptr, 9);
538 channel->global_gain = mad_bit_read(ptr, 8);
539 channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4);
541 *data_bitlen += channel->part2_3_length;
543 if (channel->big_values > 288 && result == 0)
544 result = MAD_ERROR_BADBIGVALUES;
549 if (mad_bit_read(ptr, 1)) {
550 channel->block_type = mad_bit_read(ptr, 2);
552 if (channel->block_type == 0 && result == 0)
553 result = MAD_ERROR_BADBLOCKTYPE;
555 if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0)
556 result = MAD_ERROR_BADSCFSI;
558 channel->region0_count = 7;
559 channel->region1_count = 36;
561 if (mad_bit_read(ptr, 1))
562 channel->flags |= mixed_block_flag;
563 else if (channel->block_type == 2)
564 channel->region0_count = 8;
566 for (i = 0; i < 2; ++i)
567 channel->table_select[i] = mad_bit_read(ptr, 5);
570 channel->table_select[2] = 4;
573 for (i = 0; i < 3; ++i)
574 channel->subblock_gain[i] = mad_bit_read(ptr, 3);
577 channel->block_type = 0;
579 for (i = 0; i < 3; ++i)
580 channel->table_select[i] = mad_bit_read(ptr, 5);
582 channel->region0_count = mad_bit_read(ptr, 4);
583 channel->region1_count = mad_bit_read(ptr, 3);
587 channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3);
599unsigned int III_scalefactors_lsf(
struct mad_bitptr *ptr,
600 struct channel *channel,
601 struct channel *gr1ch,
int mode_extension)
604 unsigned int scalefac_compress, index, slen[4], part, n, i;
605 unsigned char const *nsfb;
609 scalefac_compress = channel->scalefac_compress;
610 index = (channel->block_type == 2) ?
611 ((channel->flags & mixed_block_flag) ? 2 : 1) : 0;
613 if (!((mode_extension & I_STEREO) && gr1ch)) {
614 if (scalefac_compress < 400) {
615 slen[0] = (scalefac_compress >> 4) / 5;
616 slen[1] = (scalefac_compress >> 4) % 5;
617 slen[2] = (scalefac_compress % 16) >> 2;
618 slen[3] = scalefac_compress % 4;
620 nsfb = nsfb_table[0][index];
622 else if (scalefac_compress < 500) {
623 scalefac_compress -= 400;
625 slen[0] = (scalefac_compress >> 2) / 5;
626 slen[1] = (scalefac_compress >> 2) % 5;
627 slen[2] = scalefac_compress % 4;
630 nsfb = nsfb_table[1][index];
633 scalefac_compress -= 500;
635 slen[0] = scalefac_compress / 3;
636 slen[1] = scalefac_compress % 3;
640 channel->flags |= preflag;
642 nsfb = nsfb_table[2][index];
646 for (part = 0; part < 4; ++part) {
647 for (i = 0; i < nsfb[part]; ++i)
648 channel->scalefac[n++] = mad_bit_read(ptr, slen[part]);
652 channel->scalefac[n++] = 0;
655 scalefac_compress >>= 1;
657 if (scalefac_compress < 180) {
658 slen[0] = scalefac_compress / 36;
659 slen[1] = (scalefac_compress % 36) / 6;
660 slen[2] = (scalefac_compress % 36) % 6;
663 nsfb = nsfb_table[3][index];
665 else if (scalefac_compress < 244) {
666 scalefac_compress -= 180;
668 slen[0] = (scalefac_compress % 64) >> 4;
669 slen[1] = (scalefac_compress % 16) >> 2;
670 slen[2] = scalefac_compress % 4;
673 nsfb = nsfb_table[4][index];
676 scalefac_compress -= 244;
678 slen[0] = scalefac_compress / 3;
679 slen[1] = scalefac_compress % 3;
683 nsfb = nsfb_table[5][index];
687 for (part = 0; part < 4; ++part) {
688 unsigned int max, is_pos;
690 max = (1 << slen[part]) - 1;
692 for (i = 0; i < nsfb[part]; ++i) {
693 is_pos = mad_bit_read(ptr, slen[part]);
695 channel->scalefac[n] = is_pos;
696 gr1ch->scalefac[n++] = (is_pos == max);
701 channel->scalefac[n] = 0;
702 gr1ch->scalefac[n++] = 0;
706 return mad_bit_length(&start, ptr);
714unsigned int III_scalefactors(
struct mad_bitptr *ptr,
struct channel *channel,
715 struct channel
const *gr0ch,
unsigned int scfsi)
718 unsigned int slen1, slen2, sfbi;
722 slen1 = sflen_table[channel->scalefac_compress].slen1;
723 slen2 = sflen_table[channel->scalefac_compress].slen2;
725 if (channel->block_type == 2) {
730 nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3;
732 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1);
736 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2);
740 channel->scalefac[sfbi++] = 0;
744 for (sfbi = 0; sfbi < 6; ++sfbi)
745 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
748 for (sfbi = 0; sfbi < 6; ++sfbi)
749 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
753 for (sfbi = 6; sfbi < 11; ++sfbi)
754 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
757 for (sfbi = 6; sfbi < 11; ++sfbi)
758 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
762 for (sfbi = 11; sfbi < 16; ++sfbi)
763 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
766 for (sfbi = 11; sfbi < 16; ++sfbi)
767 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
771 for (sfbi = 16; sfbi < 21; ++sfbi)
772 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
775 for (sfbi = 16; sfbi < 21; ++sfbi)
776 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
779 channel->scalefac[21] = 0;
782 return mad_bit_length(&start, ptr);
812void III_exponents(
struct channel
const *channel,
813 unsigned char const *sfbwidth,
signed int exponents[39])
816 unsigned int scalefac_multiplier, sfbi;
818 gain = (
signed int) channel->global_gain - 210;
819 scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1;
821 if (channel->block_type == 2) {
823 signed int gain0, gain1, gain2;
827 if (channel->flags & mixed_block_flag) {
828 unsigned int premask;
830 premask = (channel->flags & preflag) ? ~0 : 0;
835 exponents[sfbi] = gain -
836 (
signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) <<
837 scalefac_multiplier);
839 l += sfbwidth[sfbi++];
845 gain0 = gain - 8 * (
signed int) channel->subblock_gain[0];
846 gain1 = gain - 8 * (
signed int) channel->subblock_gain[1];
847 gain2 = gain - 8 * (
signed int) channel->subblock_gain[2];
850 exponents[sfbi + 0] = gain0 -
851 (
signed int) (channel->scalefac[sfbi + 0] << scalefac_multiplier);
852 exponents[sfbi + 1] = gain1 -
853 (
signed int) (channel->scalefac[sfbi + 1] << scalefac_multiplier);
854 exponents[sfbi + 2] = gain2 -
855 (
signed int) (channel->scalefac[sfbi + 2] << scalefac_multiplier);
857 l += 3 * sfbwidth[sfbi];
862 if (channel->flags & preflag) {
863 for (sfbi = 0; sfbi < 22; ++sfbi) {
864 exponents[sfbi] = gain -
865 (
signed int) ((channel->scalefac[sfbi] + pretab[sfbi]) <<
866 scalefac_multiplier);
870 for (sfbi = 0; sfbi < 22; ++sfbi) {
871 exponents[sfbi] = gain -
872 (
signed int) (channel->scalefac[sfbi] << scalefac_multiplier);
883mad_fixed_t III_requantize(
unsigned int value,
signed int exp)
885 mad_fixed_t requantized;
887 struct fixedfloat const *power;
892 power = &rq_table[value];
893 requantized = power->mantissa;
894 exp += power->exponent;
897 if (-exp >=
sizeof(mad_fixed_t) * CHAR_BIT) {
902 requantized += 1L << (-exp - 1);
903 requantized >>= -exp;
910 fprintf(stderr,
"requantize overflow (%f * 2^%d)\n",
911 mad_f_todouble(requantized), exp);
913 requantized = MAD_F_MAX;
919 return frac ? mad_f_mul(requantized, root_table[3 + frac]) : requantized;
923# define MASK(cache, sz, bits) \
924 (((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1))
925# define MASK1BIT(cache, sz) \
926 ((cache) & (1 << ((sz) - 1)))
933enum mad_error III_huffdecode(
struct mad_bitptr *ptr, mad_fixed_t xr[576],
934 struct channel *channel,
935 unsigned char const *sfbwidth,
936 unsigned int part2_length)
938 signed int exponents[39], exp;
939 signed int const *expptr;
941 signed int bits_left, cachesz;
942 register mad_fixed_t *xrptr;
943 mad_fixed_t
const *sfbound;
944 register unsigned long bitcache;
946 bits_left = (signed) channel->part2_3_length - (
signed) part2_length;
948 return MAD_ERROR_BADPART3LEN;
950 III_exponents(channel, sfbwidth, exponents);
953 mad_bit_skip(ptr, bits_left);
956 cachesz = mad_bit_bitsleft(&peek);
957 cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;
959 bitcache = mad_bit_read(&peek, cachesz);
960 bits_left -= cachesz;
966 unsigned int region, rcount;
969 unsigned int linbits, startbits, big_values, reqhits;
970 mad_fixed_t reqcache[16];
972 sfbound = xrptr + *sfbwidth++;
973 rcount = channel->region0_count + 1;
975 entry = &mad_huff_pair_table[channel->table_select[region = 0]];
976 table = entry->table;
977 linbits = entry->linbits;
978 startbits = entry->startbits;
981 return MAD_ERROR_BADHUFFTABLE;
983 expptr = &exponents[0];
987 big_values = channel->big_values;
989 while (big_values-- && cachesz + bits_left > 0) {
991 unsigned int clumpsz, value;
992 register mad_fixed_t requantized;
994 if (xrptr == sfbound) {
995 sfbound += *sfbwidth++;
1001 rcount = channel->region1_count + 1;
1005 entry = &mad_huff_pair_table[channel->table_select[++region]];
1006 table = entry->table;
1007 linbits = entry->linbits;
1008 startbits = entry->startbits;
1011 return MAD_ERROR_BADHUFFTABLE;
1014 if (exp != *expptr) {
1025 bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7;
1026 bitcache = (bitcache << bits) | mad_bit_read(&peek, bits);
1033 clumpsz = startbits;
1034 pair = &table[MASK(bitcache, cachesz, clumpsz)];
1036 while (!pair->final) {
1039 clumpsz = pair->ptr.bits;
1040 pair = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)];
1043 cachesz -= pair->value.hlen;
1048 value = pair->value.x;
1056 if (cachesz < linbits + 2) {
1057 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1062 value += MASK(bitcache, cachesz, linbits);
1065 requantized = III_requantize(value, exp);
1069 if (reqhits & (1 << value))
1070 requantized = reqcache[value];
1072 reqhits |= (1 << value);
1073 requantized = reqcache[value] = III_requantize(value, exp);
1077 xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
1078 -requantized : requantized;
1083 value = pair->value.y;
1091 if (cachesz < linbits + 1) {
1092 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1097 value += MASK(bitcache, cachesz, linbits);
1100 requantized = III_requantize(value, exp);
1104 if (reqhits & (1 << value))
1105 requantized = reqcache[value];
1107 reqhits |= (1 << value);
1108 requantized = reqcache[value] = III_requantize(value, exp);
1112 xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
1113 -requantized : requantized;
1119 value = pair->value.x;
1124 if (reqhits & (1 << value))
1125 requantized = reqcache[value];
1127 reqhits |= (1 << value);
1128 requantized = reqcache[value] = III_requantize(value, exp);
1131 xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
1132 -requantized : requantized;
1137 value = pair->value.y;
1142 if (reqhits & (1 << value))
1143 requantized = reqcache[value];
1145 reqhits |= (1 << value);
1146 requantized = reqcache[value] = III_requantize(value, exp);
1149 xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
1150 -requantized : requantized;
1158 if (cachesz + bits_left < 0)
1159 return MAD_ERROR_BADHUFFDATA;
1164 register mad_fixed_t requantized;
1166 table = mad_huff_quad_table[channel->flags & count1table_select];
1168 requantized = III_requantize(1, exp);
1170 while (cachesz + bits_left > 0 && xrptr <= &xr[572]) {
1176 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
1181 quad = &table[MASK(bitcache, cachesz, 4)];
1187 quad = &table[quad->ptr.offset +
1188 MASK(bitcache, cachesz, quad->ptr.bits)];
1191 cachesz -= quad->value.hlen;
1193 if (xrptr == sfbound) {
1194 sfbound += *sfbwidth++;
1196 if (exp != *expptr) {
1198 requantized = III_requantize(1, exp);
1206 xrptr[0] = quad->value.v ?
1207 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1211 xrptr[1] = quad->value.w ?
1212 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1216 if (xrptr == sfbound) {
1217 sfbound += *sfbwidth++;
1219 if (exp != *expptr) {
1221 requantized = III_requantize(1, exp);
1229 xrptr[0] = quad->value.x ?
1230 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1234 xrptr[1] = quad->value.y ?
1235 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
1240 if (cachesz + bits_left < 0) {
1241# if 0 && defined(DEBUG)
1242 fprintf(stderr,
"huffman count1 overrun (%d bits)\n",
1243 -(cachesz + bits_left));
1253 assert(-bits_left <= MAD_BUFFER_GUARD * CHAR_BIT);
1255# if 0 && defined(DEBUG)
1257 fprintf(stderr,
"read %d bits too many\n", -bits_left);
1258 else if (cachesz + bits_left > 0)
1259 fprintf(stderr,
"%d stuffing bits\n", cachesz + bits_left);
1263 while (xrptr < &xr[576]) {
1270 return MAD_ERROR_NONE;
1281void III_reorder(mad_fixed_t xr[576],
struct channel
const *channel,
1282 unsigned char const sfbwidth[39])
1284 mad_fixed_t tmp[32][3][6];
1285 unsigned int sb, l, f, w, sbw[3], sw[3];
1290 if (channel->flags & mixed_block_flag) {
1298 for (w = 0; w < 3; ++w) {
1306 for (l = 18 * sb; l < 576; ++l) {
1308 f = *sfbwidth++ - 1;
1312 tmp[sbw[w]][w][sw[w]++] = xr[l];
1320 memcpy(&xr[18 * sb], &tmp[sb], (576 - 18 * sb) *
sizeof(mad_fixed_t));
1328enum mad_error III_stereo(mad_fixed_t xr[2][576],
1329 struct granule
const *granule,
1331 unsigned char const *sfbwidth)
1334 unsigned int sfbi, l, n, i;
1336 if (granule->ch[0].block_type !=
1337 granule->ch[1].block_type ||
1338 (granule->ch[0].flags & mixed_block_flag) !=
1339 (granule->ch[1].flags & mixed_block_flag))
1340 return MAD_ERROR_BADSTEREO;
1342 for (i = 0; i < 39; ++i)
1343 modes[i] = header->mode_extension;
1347 if (header->mode_extension & I_STEREO) {
1348 struct channel const *right_ch = &granule->ch[1];
1349 mad_fixed_t
const *right_xr = xr[1];
1350 unsigned int is_pos;
1352 header->flags |= MAD_FLAG_I_STEREO;
1356 if (right_ch->block_type == 2) {
1357 unsigned int lower, start, max, bound[3], w;
1359 lower = start = max = bound[0] = bound[1] = bound[2] = 0;
1363 if (right_ch->flags & mixed_block_flag) {
1365 n = sfbwidth[sfbi++];
1367 for (i = 0; i < n; ++i) {
1383 n = sfbwidth[sfbi++];
1385 for (i = 0; i < n; ++i) {
1387 max = bound[w] = sfbi;
1402 for (i = 0; i < lower; ++i)
1403 modes[i] = header->mode_extension & ~I_STEREO;
1408 for (i = start; i < max; ++i) {
1410 modes[i] = header->mode_extension & ~I_STEREO;
1419 for (sfbi = l = 0; l < 576; l += n) {
1420 n = sfbwidth[sfbi++];
1422 for (i = 0; i < n; ++i) {
1432 for (i = 0; i < bound; ++i)
1433 modes[i] = header->mode_extension & ~I_STEREO;
1438 if (header->flags & MAD_FLAG_LSF_EXT) {
1439 unsigned char const *illegal_pos = granule[1].ch[1].scalefac;
1440 mad_fixed_t
const *lsf_scale;
1443 lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1];
1445 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1448 if (!(modes[sfbi] & I_STEREO))
1451 if (illegal_pos[sfbi]) {
1452 modes[sfbi] &= ~I_STEREO;
1456 is_pos = right_ch->scalefac[sfbi];
1458 for (i = 0; i < n; ++i) {
1459 register mad_fixed_t left;
1461 left = xr[0][l + i];
1464 xr[1][l + i] = left;
1466 register mad_fixed_t opposite;
1468 opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]);
1471 xr[0][l + i] = opposite;
1472 xr[1][l + i] = left;
1475 xr[1][l + i] = opposite;
1481 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1484 if (!(modes[sfbi] & I_STEREO))
1487 is_pos = right_ch->scalefac[sfbi];
1490 modes[sfbi] &= ~I_STEREO;
1494 for (i = 0; i < n; ++i) {
1495 register mad_fixed_t left;
1497 left = xr[0][l + i];
1499 xr[0][l + i] = mad_f_mul(left, is_table[ is_pos]);
1500 xr[1][l + i] = mad_f_mul(left, is_table[6 - is_pos]);
1508 if (header->mode_extension & MS_STEREO) {
1509 register mad_fixed_t invsqrt2;
1511 header->flags |= MAD_FLAG_MS_STEREO;
1513 invsqrt2 = root_table[3 + -2];
1515 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
1518 if (modes[sfbi] != MS_STEREO)
1521 for (i = 0; i < n; ++i) {
1522 register mad_fixed_t m, s;
1527 xr[0][l + i] = mad_f_mul(m + s, invsqrt2);
1528 xr[1][l + i] = mad_f_mul(m - s, invsqrt2);
1533 return MAD_ERROR_NONE;
1541void III_aliasreduce(mad_fixed_t xr[576],
int lines)
1543 mad_fixed_t
const *bound;
1547 for (xr += 18; xr < bound; xr += 18) {
1548 for (i = 0; i < 8; ++i) {
1549 register mad_fixed_t a, b;
1550 register mad_fixed64hi_t hi;
1551 register mad_fixed64lo_t lo;
1556# if defined(ASO_ZEROCHECK)
1559 MAD_F_ML0(hi, lo, a, cs[i]);
1560 MAD_F_MLA(hi, lo, -b, ca[i]);
1562 xr[-1 - i] = MAD_F_MLZ(hi, lo);
1564 MAD_F_ML0(hi, lo, b, cs[i]);
1565 MAD_F_MLA(hi, lo, a, ca[i]);
1567 xr[ i] = MAD_F_MLZ(hi, lo);
1568# if defined(ASO_ZEROCHECK)
1575# if defined(ASO_IMDCT)
1576void III_imdct_l(mad_fixed_t
const [18], mad_fixed_t [36],
unsigned int);
1580void fastsdct(mad_fixed_t
const x[9], mad_fixed_t y[18])
1582 mad_fixed_t a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12;
1583 mad_fixed_t a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25;
1584 mad_fixed_t m0, m1, m2, m3, m4, m5, m6, m7;
1587 c0 = MAD_F(0x1f838b8d),
1588 c1 = MAD_F(0x1bb67ae8),
1589 c2 = MAD_F(0x18836fa3),
1590 c3 = MAD_F(0x1491b752),
1591 c4 = MAD_F(0x0af1d43a),
1592 c5 = MAD_F(0x058e86a0),
1593 c6 = -MAD_F(0x1e11f642)
1616 m0 = mad_f_mul(a17, -c3);
1617 m1 = mad_f_mul(a16, -c0);
1618 m2 = mad_f_mul(a15, -c4);
1619 m3 = mad_f_mul(a14, -c1);
1620 m4 = mad_f_mul(a5, -c1);
1621 m5 = mad_f_mul(a11, -c6);
1622 m6 = mad_f_mul(a10, -c5);
1623 m7 = mad_f_mul(a9, -c2);
1626 a19 = 2 * x[4] - a4;
1642 y[12] = a12 - 2 * a18;
1648void sdctII(mad_fixed_t
const x[18], mad_fixed_t X[18])
1654 static mad_fixed_t
const scale[9] = {
1655 MAD_F(0x1fe0d3b4), MAD_F(0x1ee8dd47), MAD_F(0x1d007930),
1656 MAD_F(0x1a367e59), MAD_F(0x16a09e66), MAD_F(0x125abcf8),
1657 MAD_F(0x0d8616bc), MAD_F(0x08483ee1), MAD_F(0x02c9fad7)
1664 for (i = 0; i < 9; i += 3) {
1665 tmp[i + 0] = x[i + 0] + x[18 - (i + 0) - 1];
1666 tmp[i + 1] = x[i + 1] + x[18 - (i + 1) - 1];
1667 tmp[i + 2] = x[i + 2] + x[18 - (i + 2) - 1];
1670 fastsdct(tmp, &X[0]);
1674 for (i = 0; i < 9; i += 3) {
1675 tmp[i + 0] = mad_f_mul(x[i + 0] - x[18 - (i + 0) - 1], scale[i + 0]);
1676 tmp[i + 1] = mad_f_mul(x[i + 1] - x[18 - (i + 1) - 1], scale[i + 1]);
1677 tmp[i + 2] = mad_f_mul(x[i + 2] - x[18 - (i + 2) - 1], scale[i + 2]);
1680 fastsdct(tmp, &X[1]);
1684 for (i = 3; i < 18; i += 8) {
1685 X[i + 0] -= X[(i + 0) - 2];
1686 X[i + 2] -= X[(i + 2) - 2];
1687 X[i + 4] -= X[(i + 4) - 2];
1688 X[i + 6] -= X[(i + 6) - 2];
1693void dctIV(mad_fixed_t
const y[18], mad_fixed_t X[18])
1695 mad_fixed_t tmp[18];
1699 static mad_fixed_t
const scale[18] = {
1700 MAD_F(0x1ff833fa), MAD_F(0x1fb9ea93), MAD_F(0x1f3dd120),
1701 MAD_F(0x1e84d969), MAD_F(0x1d906bcf), MAD_F(0x1c62648b),
1702 MAD_F(0x1afd100f), MAD_F(0x1963268b), MAD_F(0x1797c6a4),
1703 MAD_F(0x159e6f5b), MAD_F(0x137af940), MAD_F(0x11318ef3),
1704 MAD_F(0x0ec6a507), MAD_F(0x0c3ef153), MAD_F(0x099f61c5),
1705 MAD_F(0x06ed12c5), MAD_F(0x042d4544), MAD_F(0x0165547c)
1710 for (i = 0; i < 18; i += 3) {
1711 tmp[i + 0] = mad_f_mul(y[i + 0], scale[i + 0]);
1712 tmp[i + 1] = mad_f_mul(y[i + 1], scale[i + 1]);
1713 tmp[i + 2] = mad_f_mul(y[i + 2], scale[i + 2]);
1723 for (i = 1; i < 17; i += 4) {
1724 X[i + 0] = X[i + 0] / 2 - X[(i + 0) - 1];
1725 X[i + 1] = X[i + 1] / 2 - X[(i + 1) - 1];
1726 X[i + 2] = X[i + 2] / 2 - X[(i + 2) - 1];
1727 X[i + 3] = X[i + 3] / 2 - X[(i + 3) - 1];
1729 X[17] = X[17] / 2 - X[16];
1737void imdct36(mad_fixed_t
const x[18], mad_fixed_t y[36])
1739 mad_fixed_t tmp[18];
1748 for (i = 0; i < 9; i += 3) {
1749 y[i + 0] = tmp[9 + (i + 0)];
1750 y[i + 1] = tmp[9 + (i + 1)];
1751 y[i + 2] = tmp[9 + (i + 2)];
1753 for (i = 9; i < 27; i += 3) {
1754 y[i + 0] = -tmp[36 - (9 + (i + 0)) - 1];
1755 y[i + 1] = -tmp[36 - (9 + (i + 1)) - 1];
1756 y[i + 2] = -tmp[36 - (9 + (i + 2)) - 1];
1758 for (i = 27; i < 36; i += 3) {
1759 y[i + 0] = -tmp[(i + 0) - 27];
1760 y[i + 1] = -tmp[(i + 1) - 27];
1761 y[i + 2] = -tmp[(i + 2) - 27];
1770void imdct36(mad_fixed_t
const X[18], mad_fixed_t x[36])
1772 mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7;
1773 mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15;
1774 register mad_fixed64hi_t hi;
1775 register mad_fixed64lo_t lo;
1777 MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8));
1778 MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa));
1780 t6 = MAD_F_MLZ(hi, lo);
1782 MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa));
1783 MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8));
1785 t0 = MAD_F_MLZ(hi, lo);
1787 MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2));
1788 MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0));
1789 MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346));
1790 MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549));
1792 x[7] = MAD_F_MLZ(hi, lo);
1795 MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346));
1796 MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549));
1797 MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2));
1798 MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0));
1800 x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0;
1802 t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15];
1803 t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17];
1805 MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8));
1806 MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa));
1808 x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0;
1810 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0));
1811 MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2));
1812 MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549));
1813 MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346));
1815 t1 = MAD_F_MLZ(hi, lo) + t6;
1817 MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962));
1818 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245));
1819 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd));
1820 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad));
1821 MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2));
1822 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779));
1823 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807));
1824 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5));
1825 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352));
1826 MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e));
1827 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284));
1828 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890));
1830 x[6] = MAD_F_MLZ(hi, lo) + t1;
1833 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5));
1834 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e));
1835 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779));
1836 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890));
1837 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad));
1838 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284));
1839 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245));
1840 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352));
1841 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962));
1842 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807));
1843 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd));
1844 MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2));
1846 x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1;
1848 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352));
1849 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807));
1850 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284));
1851 MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2));
1852 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890));
1853 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd));
1854 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e));
1855 MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962));
1856 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5));
1857 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245));
1858 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779));
1859 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad));
1861 x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1;
1863 MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa));
1864 MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8));
1866 t7 = MAD_F_MLZ(hi, lo);
1868 MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346));
1869 MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549));
1870 MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2));
1871 MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0));
1873 t2 = MAD_F_MLZ(hi, lo);
1875 MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2));
1876 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd));
1877 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807));
1878 MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962));
1879 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352));
1880 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245));
1881 MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284));
1882 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad));
1883 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890));
1884 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779));
1885 MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e));
1886 MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5));
1888 x[5] = MAD_F_MLZ(hi, lo);
1891 MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad));
1892 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779));
1893 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0e313245));
1894 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0f426cb5));
1895 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x03768962));
1896 MAD_F_MLA(hi, lo, X[8], MAD_F(0x00b2aa3e));
1897 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0ffc19fd));
1898 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f9ee890));
1899 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x04cfb0e2));
1900 MAD_F_MLA(hi, lo, X[14], MAD_F(0x07635284));
1901 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0d7e8807));
1902 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0bcbe352));
1904 x[0] = MAD_F_MLZ(hi, lo) + t2;
1907 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f9ee890));
1908 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x07635284));
1909 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x00b2aa3e));
1910 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0bcbe352));
1911 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f426cb5));
1912 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0d7e8807));
1913 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0898c779));
1914 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x04cfb0e2));
1915 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0acf37ad));
1916 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0ffc19fd));
1917 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0e313245));
1918 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x03768962));
1920 x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2;
1922 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0216a2a2));
1923 MAD_F_MLA(hi, lo, X[7], -MAD_F(0x09bd7ca0));
1924 MAD_F_MLA(hi, lo, X[10], MAD_F(0x0cb19346));
1925 MAD_F_MLA(hi, lo, X[16], MAD_F(0x0fdcf549));
1927 t3 = MAD_F_MLZ(hi, lo) + t7;
1929 MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e));
1930 MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962));
1931 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2));
1932 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284));
1933 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779));
1934 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad));
1935 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352));
1936 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807));
1937 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245));
1938 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5));
1939 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890));
1940 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd));
1942 x[8] = MAD_F_MLZ(hi, lo) + t3;
1945 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245));
1946 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352));
1947 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890));
1948 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779));
1949 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd));
1950 MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2));
1951 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5));
1952 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e));
1953 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807));
1954 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962));
1955 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad));
1956 MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284));
1958 x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3;
1960 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807));
1961 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5));
1962 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad));
1963 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd));
1964 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284));
1965 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890));
1966 MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962));
1967 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245));
1968 MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e));
1969 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352));
1970 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2));
1971 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779));
1973 x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3;
1975 MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8));
1976 MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa));
1978 t4 = MAD_F_MLZ(hi, lo) - t7;
1980 MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa));
1981 MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8));
1983 x[4] = MAD_F_MLZ(hi, lo) + t4;
1986 MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0));
1987 MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2));
1988 MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549));
1989 MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346));
1991 x[1] = MAD_F_MLZ(hi, lo) + t4;
1994 MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549));
1995 MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346));
1996 MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0));
1997 MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2));
1999 x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4;
2001 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549));
2002 MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346));
2003 MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0));
2004 MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2));
2006 t5 = MAD_F_MLZ(hi, lo) - t6;
2008 MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779));
2009 MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2));
2010 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352));
2011 MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e));
2012 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245));
2013 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962));
2014 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890));
2015 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284));
2016 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd));
2017 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad));
2018 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5));
2019 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807));
2021 x[2] = MAD_F_MLZ(hi, lo) + t5;
2024 MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284));
2025 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad));
2026 MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962));
2027 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807));
2028 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e));
2029 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5));
2030 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2));
2031 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd));
2032 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779));
2033 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890));
2034 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352));
2035 MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245));
2037 x[3] = MAD_F_MLZ(hi, lo) + t5;
2040 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd));
2041 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890));
2042 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5));
2043 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245));
2044 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807));
2045 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352));
2046 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad));
2047 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779));
2048 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284));
2049 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2));
2050 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962));
2051 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e));
2053 x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5;
2062void III_imdct_l(mad_fixed_t
const X[18], mad_fixed_t z[36],
2063 unsigned int block_type)
2073 switch (block_type) {
2075# if defined(ASO_INTERLEAVE1)
2077 register mad_fixed_t tmp1, tmp2;
2082 for (i = 0; i < 34; i += 2) {
2083 z[i + 0] = mad_f_mul(z[i + 0], tmp1);
2084 tmp1 = window_l[i + 2];
2085 z[i + 1] = mad_f_mul(z[i + 1], tmp2);
2086 tmp2 = window_l[i + 3];
2089 z[34] = mad_f_mul(z[34], tmp1);
2090 z[35] = mad_f_mul(z[35], tmp2);
2092# elif defined(ASO_INTERLEAVE2)
2094 register mad_fixed_t tmp1, tmp2;
2099 for (i = 0; i < 35; ++i) {
2100 z[i] = mad_f_mul(tmp1, tmp2);
2102 tmp2 = window_l[i + 1];
2105 z[35] = mad_f_mul(tmp1, tmp2);
2108 for (i = 0; i < 36; i += 4) {
2109 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2110 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2111 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2112 z[i + 3] = mad_f_mul(z[i + 3], window_l[i + 3]);
2115 for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]);
2120 for (i = 0; i < 18; i += 3) {
2121 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2122 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2123 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2126 for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s[i - 18]);
2127 for (i = 30; i < 36; ++i) z[i] = 0;
2131 for (i = 0; i < 6; ++i) z[i] = 0;
2132 for (i = 6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s[i - 6]);
2134 for (i = 18; i < 36; i += 3) {
2135 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
2136 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
2137 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
2149void III_imdct_s(mad_fixed_t
const X[18], mad_fixed_t z[36])
2151 mad_fixed_t y[36], *yptr;
2152 mad_fixed_t
const *wptr;
2154 register mad_fixed64hi_t hi;
2155 register mad_fixed64lo_t lo;
2161 for (w = 0; w < 3; ++w) {
2162 register mad_fixed_t
const (*s)[6];
2166 for (i = 0; i < 3; ++i) {
2167 MAD_F_ML0(hi, lo, X[0], (*s)[0]);
2168 MAD_F_MLA(hi, lo, X[1], (*s)[1]);
2169 MAD_F_MLA(hi, lo, X[2], (*s)[2]);
2170 MAD_F_MLA(hi, lo, X[3], (*s)[3]);
2171 MAD_F_MLA(hi, lo, X[4], (*s)[4]);
2172 MAD_F_MLA(hi, lo, X[5], (*s)[5]);
2174 yptr[i + 0] = MAD_F_MLZ(hi, lo);
2175 yptr[5 - i] = -yptr[i + 0];
2179 MAD_F_ML0(hi, lo, X[0], (*s)[0]);
2180 MAD_F_MLA(hi, lo, X[1], (*s)[1]);
2181 MAD_F_MLA(hi, lo, X[2], (*s)[2]);
2182 MAD_F_MLA(hi, lo, X[3], (*s)[3]);
2183 MAD_F_MLA(hi, lo, X[4], (*s)[4]);
2184 MAD_F_MLA(hi, lo, X[5], (*s)[5]);
2186 yptr[ i + 6] = MAD_F_MLZ(hi, lo);
2187 yptr[11 - i] = yptr[i + 6];
2199 wptr = &window_s[0];
2201 for (i = 0; i < 6; ++i) {
2203 z[i + 6] = mad_f_mul(yptr[ 0 + 0], wptr[0]);
2205 MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]);
2206 MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]);
2208 z[i + 12] = MAD_F_MLZ(hi, lo);
2210 MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]);
2211 MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]);
2213 z[i + 18] = MAD_F_MLZ(hi, lo);
2215 z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]);
2228void III_overlap(mad_fixed_t
const output[36], mad_fixed_t overlap[18],
2229 mad_fixed_t sample[18][32],
unsigned int sb)
2233# if defined(ASO_INTERLEAVE2)
2235 register mad_fixed_t tmp1, tmp2;
2240 for (i = 0; i < 16; i += 2) {
2241 sample[i + 0][sb] = output[i + 0 + 0] + tmp1;
2242 overlap[i + 0] = output[i + 0 + 18];
2243 tmp1 = overlap[i + 2];
2245 sample[i + 1][sb] = output[i + 1 + 0] + tmp2;
2246 overlap[i + 1] = output[i + 1 + 18];
2247 tmp2 = overlap[i + 3];
2250 sample[16][sb] = output[16 + 0] + tmp1;
2251 overlap[16] = output[16 + 18];
2252 sample[17][sb] = output[17 + 0] + tmp2;
2253 overlap[17] = output[17 + 18];
2256 for (i = 0; i < 18; i += 2) {
2257 sample[i + 0][sb] = output[i + 0 + 0] + overlap[i + 0];
2258 overlap[i + 0] = output[i + 0 + 18];
2260 sample[i + 1][sb] = output[i + 1 + 0] + overlap[i + 1];
2261 overlap[i + 1] = output[i + 1 + 18];
2264 for (i = 0; i < 18; ++i) {
2265 sample[i][sb] = output[i + 0] + overlap[i];
2266 overlap[i] = output[i + 18];
2276void III_overlap_z(mad_fixed_t overlap[18],
2277 mad_fixed_t sample[18][32],
unsigned int sb)
2281# if defined(ASO_INTERLEAVE2)
2283 register mad_fixed_t tmp1, tmp2;
2288 for (i = 0; i < 16; i += 2) {
2289 sample[i + 0][sb] = tmp1;
2291 tmp1 = overlap[i + 2];
2293 sample[i + 1][sb] = tmp2;
2295 tmp2 = overlap[i + 3];
2298 sample[16][sb] = tmp1;
2300 sample[17][sb] = tmp2;
2304 for (i = 0; i < 18; ++i) {
2305 sample[i][sb] = overlap[i];
2316void III_freqinver(mad_fixed_t sample[18][32],
unsigned int sb)
2320# if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2)
2322 register mad_fixed_t tmp1, tmp2;
2324 tmp1 = sample[1][sb];
2325 tmp2 = sample[3][sb];
2327 for (i = 1; i < 13; i += 4) {
2328 sample[i + 0][sb] = -tmp1;
2329 tmp1 = sample[i + 4][sb];
2330 sample[i + 2][sb] = -tmp2;
2331 tmp2 = sample[i + 6][sb];
2334 sample[13][sb] = -tmp1;
2335 tmp1 = sample[17][sb];
2336 sample[15][sb] = -tmp2;
2337 sample[17][sb] = -tmp1;
2340 for (i = 1; i < 18; i += 2)
2341 sample[i][sb] = -sample[i][sb];
2351 struct sideinfo *si,
unsigned int nch)
2354 unsigned int sfreqi, ngr, gr;
2359 sfreq = header->samplerate;
2360 if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
2365 sfreqi = ((sfreq >> 7) & 0x000f) +
2366 ((sfreq >> 15) & 0x0001) - 8;
2368 if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
2374 ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2;
2376 for (gr = 0; gr < ngr; ++gr) {
2377 struct granule *granule = &si->gr[gr];
2378 unsigned char const *sfbwidth[2];
2379 mad_fixed_t xr[2][576];
2381 enum mad_error error;
2383 for (ch = 0; ch < nch; ++ch) {
2384 struct channel *channel = &granule->ch[ch];
2385 unsigned int part2_length;
2387 sfbwidth[ch] = sfbwidth_table[sfreqi].l;
2388 if (channel->block_type == 2) {
2389 sfbwidth[ch] = (channel->flags & mixed_block_flag) ?
2390 sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s;
2393 if (header->flags & MAD_FLAG_LSF_EXT) {
2394 part2_length = III_scalefactors_lsf(ptr, channel,
2395 ch == 0 ? 0 : &si->gr[1].ch[1],
2396 header->mode_extension);
2399 part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch],
2400 gr == 0 ? 0 : si->scfsi[ch]);
2403 error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length);
2410 if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) {
2411 error = III_stereo(xr, granule, header, sfbwidth[0]);
2418 for (ch = 0; ch < nch; ++ch) {
2419 struct channel const *channel = &granule->ch[ch];
2420 mad_fixed_t (*sample)[32] = &frame->sbsample[ch][18 * gr];
2421 unsigned int sb, l, i, sblimit;
2422 mad_fixed_t output[36];
2424 if (channel->block_type == 2) {
2425 III_reorder(xr[ch], channel, sfbwidth[ch]);
2427# if !defined(OPT_STRICT)
2435 if (channel->flags & mixed_block_flag)
2436 III_aliasreduce(xr[ch], 36);
2440 III_aliasreduce(xr[ch], 576);
2446 if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) {
2447 unsigned int block_type;
2449 block_type = channel->block_type;
2450 if (channel->flags & mixed_block_flag)
2454 for (sb = 0; sb < 2; ++sb, l += 18) {
2455 III_imdct_l(&xr[ch][l], output, block_type);
2456 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2461 for (sb = 0; sb < 2; ++sb, l += 18) {
2462 III_imdct_s(&xr[ch][l], output);
2463 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2467 III_freqinver(sample, 1);
2472 while (i > 36 && xr[ch][i - 1] == 0)
2475 sblimit = 32 - (576 - i) / 18;
2477 if (channel->block_type != 2) {
2479 for (sb = 2; sb < sblimit; ++sb, l += 18) {
2480 III_imdct_l(&xr[ch][l], output, channel->block_type);
2481 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2484 III_freqinver(sample, sb);
2489 for (sb = 2; sb < sblimit; ++sb, l += 18) {
2490 III_imdct_s(&xr[ch][l], output);
2491 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
2494 III_freqinver(sample, sb);
2500 for (sb = sblimit; sb < 32; ++sb) {
2501 III_overlap_z((*frame->overlap)[ch][sb], sample, sb);
2504 III_freqinver(sample, sb);
2509 return MAD_ERROR_NONE;
2519 unsigned int nch, priv_bitlen, next_md_begin = 0;
2520 unsigned int si_len, data_bitlen, md_len;
2521 unsigned int frame_space, frame_used, frame_free;
2524 enum mad_error error;
2529 if (stream->main_data == 0) {
2530 stream->main_data = malloc(MAD_BUFFER_MDLEN);
2531 if (stream->main_data == 0) {
2532 stream->error = MAD_ERROR_NOMEM;
2537 if (frame->overlap == 0) {
2538 frame->overlap = calloc(2 * 32 * 18,
sizeof(mad_fixed_t));
2539 if (frame->overlap == 0) {
2540 stream->error = MAD_ERROR_NOMEM;
2545 nch = MAD_NCHANNELS(header);
2546 si_len = (header->flags & MAD_FLAG_LSF_EXT) ?
2547 (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32);
2551 if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) <
2552 (
signed int) si_len) {
2553 stream->error = MAD_ERROR_BADFRAMELEN;
2560 if (header->flags & MAD_FLAG_PROTECTION) {
2562 mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check);
2564 if (header->crc_check != header->crc_target &&
2565 !(frame->options & MAD_OPTION_IGNORECRC)) {
2566 stream->error = MAD_ERROR_BADCRC;
2573 error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT,
2574 &si, &data_bitlen, &priv_bitlen);
2575 if (error && result == 0) {
2576 stream->error = error;
2580 header->flags |= priv_bitlen;
2581 header->private_bits |= si.private_bits;
2587 unsigned long header;
2589 mad_bit_init(&peek, stream->next_frame);
2591 header = mad_bit_read(&peek, 32);
2592 if ((header & 0xffe60000L) == 0xffe20000L) {
2593 if (!(header & 0x00010000L))
2594 mad_bit_skip(&peek, 16);
2597 mad_bit_read(&peek, (header & 0x00080000L) ? 9 : 8);
2600 mad_bit_finish(&peek);
2605 frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr);
2607 if (next_md_begin > si.main_data_begin + frame_space)
2610 md_len = si.main_data_begin + frame_space - next_md_begin;
2614 if (si.main_data_begin == 0) {
2618 frame_used = md_len;
2621 if (si.main_data_begin > stream->md_len) {
2623 stream->error = MAD_ERROR_BADDATAPTR;
2629 *stream->main_data + stream->md_len - si.main_data_begin);
2631 if (md_len > si.main_data_begin) {
2632 assert(stream->md_len + md_len -
2633 si.main_data_begin <= MAD_BUFFER_MDLEN);
2635 memcpy(*stream->main_data + stream->md_len,
2636 mad_bit_nextbyte(&stream->ptr),
2637 frame_used = md_len - si.main_data_begin);
2638 stream->md_len += frame_used;
2643 frame_free = frame_space - frame_used;
2648 error = III_decode(&ptr, frame, &si, nch);
2650 stream->error = error;
2656 stream->anc_ptr = ptr;
2657 stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen;
2660# if 0 && defined(DEBUG)
2662 "main_data_begin:%u, md_len:%u, frame_free:%u, "
2663 "data_bitlen:%u, anc_bitlen: %u\n",
2664 si.main_data_begin, md_len, frame_free,
2665 data_bitlen, stream->anc_bitlen);
2670 if (frame_free >= next_md_begin) {
2671 memcpy(*stream->main_data,
2672 stream->next_frame - next_md_begin, next_md_begin);
2673 stream->md_len = next_md_begin;
2676 if (md_len < si.main_data_begin) {
2679 extra = si.main_data_begin - md_len;
2680 if (extra + frame_free > next_md_begin)
2681 extra = next_md_begin - frame_free;
2683 if (extra < stream->md_len) {
2684 memmove(*stream->main_data,
2685 *stream->main_data + stream->md_len - extra, extra);
2686 stream->md_len = extra;
2692 memcpy(*stream->main_data + stream->md_len,
2693 stream->next_frame - frame_free, frame_free);
2694 stream->md_len += frame_free;