annotate src/libmad-0.15.1b/layer3.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 * libmad - MPEG audio decoder library
Chris@0 3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
Chris@0 4 *
Chris@0 5 * This program is free software; you can redistribute it and/or modify
Chris@0 6 * it under the terms of the GNU General Public License as published by
Chris@0 7 * the Free Software Foundation; either version 2 of the License, or
Chris@0 8 * (at your option) any later version.
Chris@0 9 *
Chris@0 10 * This program is distributed in the hope that it will be useful,
Chris@0 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 13 * GNU General Public License for more details.
Chris@0 14 *
Chris@0 15 * You should have received a copy of the GNU General Public License
Chris@0 16 * along with this program; if not, write to the Free Software
Chris@0 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Chris@0 18 *
Chris@0 19 * $Id: layer3.c,v 1.43 2004/01/23 09:41:32 rob Exp $
Chris@0 20 */
Chris@0 21
Chris@0 22 # ifdef HAVE_CONFIG_H
Chris@0 23 # include "config.h"
Chris@0 24 # endif
Chris@0 25
Chris@0 26 # include "global.h"
Chris@0 27
Chris@0 28 # include <stdlib.h>
Chris@0 29 # include <string.h>
Chris@0 30
Chris@0 31 # ifdef HAVE_ASSERT_H
Chris@0 32 # include <assert.h>
Chris@0 33 # endif
Chris@0 34
Chris@0 35 # ifdef HAVE_LIMITS_H
Chris@0 36 # include <limits.h>
Chris@0 37 # else
Chris@0 38 # define CHAR_BIT 8
Chris@0 39 # endif
Chris@0 40
Chris@0 41 # include "fixed.h"
Chris@0 42 # include "bit.h"
Chris@0 43 # include "stream.h"
Chris@0 44 # include "frame.h"
Chris@0 45 # include "huffman.h"
Chris@0 46 # include "layer3.h"
Chris@0 47
Chris@0 48 /* --- Layer III ----------------------------------------------------------- */
Chris@0 49
Chris@0 50 enum {
Chris@0 51 count1table_select = 0x01,
Chris@0 52 scalefac_scale = 0x02,
Chris@0 53 preflag = 0x04,
Chris@0 54 mixed_block_flag = 0x08
Chris@0 55 };
Chris@0 56
Chris@0 57 enum {
Chris@0 58 I_STEREO = 0x1,
Chris@0 59 MS_STEREO = 0x2
Chris@0 60 };
Chris@0 61
Chris@0 62 struct sideinfo {
Chris@0 63 unsigned int main_data_begin;
Chris@0 64 unsigned int private_bits;
Chris@0 65
Chris@0 66 unsigned char scfsi[2];
Chris@0 67
Chris@0 68 struct granule {
Chris@0 69 struct channel {
Chris@0 70 /* from side info */
Chris@0 71 unsigned short part2_3_length;
Chris@0 72 unsigned short big_values;
Chris@0 73 unsigned short global_gain;
Chris@0 74 unsigned short scalefac_compress;
Chris@0 75
Chris@0 76 unsigned char flags;
Chris@0 77 unsigned char block_type;
Chris@0 78 unsigned char table_select[3];
Chris@0 79 unsigned char subblock_gain[3];
Chris@0 80 unsigned char region0_count;
Chris@0 81 unsigned char region1_count;
Chris@0 82
Chris@0 83 /* from main_data */
Chris@0 84 unsigned char scalefac[39]; /* scalefac_l and/or scalefac_s */
Chris@0 85 } ch[2];
Chris@0 86 } gr[2];
Chris@0 87 };
Chris@0 88
Chris@0 89 /*
Chris@0 90 * scalefactor bit lengths
Chris@0 91 * derived from section 2.4.2.7 of ISO/IEC 11172-3
Chris@0 92 */
Chris@0 93 static
Chris@0 94 struct {
Chris@0 95 unsigned char slen1;
Chris@0 96 unsigned char slen2;
Chris@0 97 } const sflen_table[16] = {
Chris@0 98 { 0, 0 }, { 0, 1 }, { 0, 2 }, { 0, 3 },
Chris@0 99 { 3, 0 }, { 1, 1 }, { 1, 2 }, { 1, 3 },
Chris@0 100 { 2, 1 }, { 2, 2 }, { 2, 3 }, { 3, 1 },
Chris@0 101 { 3, 2 }, { 3, 3 }, { 4, 2 }, { 4, 3 }
Chris@0 102 };
Chris@0 103
Chris@0 104 /*
Chris@0 105 * number of LSF scalefactor band values
Chris@0 106 * derived from section 2.4.3.2 of ISO/IEC 13818-3
Chris@0 107 */
Chris@0 108 static
Chris@0 109 unsigned char const nsfb_table[6][3][4] = {
Chris@0 110 { { 6, 5, 5, 5 },
Chris@0 111 { 9, 9, 9, 9 },
Chris@0 112 { 6, 9, 9, 9 } },
Chris@0 113
Chris@0 114 { { 6, 5, 7, 3 },
Chris@0 115 { 9, 9, 12, 6 },
Chris@0 116 { 6, 9, 12, 6 } },
Chris@0 117
Chris@0 118 { { 11, 10, 0, 0 },
Chris@0 119 { 18, 18, 0, 0 },
Chris@0 120 { 15, 18, 0, 0 } },
Chris@0 121
Chris@0 122 { { 7, 7, 7, 0 },
Chris@0 123 { 12, 12, 12, 0 },
Chris@0 124 { 6, 15, 12, 0 } },
Chris@0 125
Chris@0 126 { { 6, 6, 6, 3 },
Chris@0 127 { 12, 9, 9, 6 },
Chris@0 128 { 6, 12, 9, 6 } },
Chris@0 129
Chris@0 130 { { 8, 8, 5, 0 },
Chris@0 131 { 15, 12, 9, 0 },
Chris@0 132 { 6, 18, 9, 0 } }
Chris@0 133 };
Chris@0 134
Chris@0 135 /*
Chris@0 136 * MPEG-1 scalefactor band widths
Chris@0 137 * derived from Table B.8 of ISO/IEC 11172-3
Chris@0 138 */
Chris@0 139 static
Chris@0 140 unsigned char const sfb_48000_long[] = {
Chris@0 141 4, 4, 4, 4, 4, 4, 6, 6, 6, 8, 10,
Chris@0 142 12, 16, 18, 22, 28, 34, 40, 46, 54, 54, 192
Chris@0 143 };
Chris@0 144
Chris@0 145 static
Chris@0 146 unsigned char const sfb_44100_long[] = {
Chris@0 147 4, 4, 4, 4, 4, 4, 6, 6, 8, 8, 10,
Chris@0 148 12, 16, 20, 24, 28, 34, 42, 50, 54, 76, 158
Chris@0 149 };
Chris@0 150
Chris@0 151 static
Chris@0 152 unsigned char const sfb_32000_long[] = {
Chris@0 153 4, 4, 4, 4, 4, 4, 6, 6, 8, 10, 12,
Chris@0 154 16, 20, 24, 30, 38, 46, 56, 68, 84, 102, 26
Chris@0 155 };
Chris@0 156
Chris@0 157 static
Chris@0 158 unsigned char const sfb_48000_short[] = {
Chris@0 159 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
Chris@0 160 6, 6, 6, 6, 6, 10, 10, 10, 12, 12, 12, 14, 14,
Chris@0 161 14, 16, 16, 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
Chris@0 162 };
Chris@0 163
Chris@0 164 static
Chris@0 165 unsigned char const sfb_44100_short[] = {
Chris@0 166 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
Chris@0 167 6, 6, 8, 8, 8, 10, 10, 10, 12, 12, 12, 14, 14,
Chris@0 168 14, 18, 18, 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
Chris@0 169 };
Chris@0 170
Chris@0 171 static
Chris@0 172 unsigned char const sfb_32000_short[] = {
Chris@0 173 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 6,
Chris@0 174 6, 6, 8, 8, 8, 12, 12, 12, 16, 16, 16, 20, 20,
Chris@0 175 20, 26, 26, 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
Chris@0 176 };
Chris@0 177
Chris@0 178 static
Chris@0 179 unsigned char const sfb_48000_mixed[] = {
Chris@0 180 /* long */ 4, 4, 4, 4, 4, 4, 6, 6,
Chris@0 181 /* short */ 4, 4, 4, 6, 6, 6, 6, 6, 6, 10,
Chris@0 182 10, 10, 12, 12, 12, 14, 14, 14, 16, 16,
Chris@0 183 16, 20, 20, 20, 26, 26, 26, 66, 66, 66
Chris@0 184 };
Chris@0 185
Chris@0 186 static
Chris@0 187 unsigned char const sfb_44100_mixed[] = {
Chris@0 188 /* long */ 4, 4, 4, 4, 4, 4, 6, 6,
Chris@0 189 /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 10,
Chris@0 190 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
Chris@0 191 18, 22, 22, 22, 30, 30, 30, 56, 56, 56
Chris@0 192 };
Chris@0 193
Chris@0 194 static
Chris@0 195 unsigned char const sfb_32000_mixed[] = {
Chris@0 196 /* long */ 4, 4, 4, 4, 4, 4, 6, 6,
Chris@0 197 /* short */ 4, 4, 4, 6, 6, 6, 8, 8, 8, 12,
Chris@0 198 12, 12, 16, 16, 16, 20, 20, 20, 26, 26,
Chris@0 199 26, 34, 34, 34, 42, 42, 42, 12, 12, 12
Chris@0 200 };
Chris@0 201
Chris@0 202 /*
Chris@0 203 * MPEG-2 scalefactor band widths
Chris@0 204 * derived from Table B.2 of ISO/IEC 13818-3
Chris@0 205 */
Chris@0 206 static
Chris@0 207 unsigned char const sfb_24000_long[] = {
Chris@0 208 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
Chris@0 209 18, 22, 26, 32, 38, 46, 54, 62, 70, 76, 36
Chris@0 210 };
Chris@0 211
Chris@0 212 static
Chris@0 213 unsigned char const sfb_22050_long[] = {
Chris@0 214 6, 6, 6, 6, 6, 6, 8, 10, 12, 14, 16,
Chris@0 215 20, 24, 28, 32, 38, 46, 52, 60, 68, 58, 54
Chris@0 216 };
Chris@0 217
Chris@0 218 # define sfb_16000_long sfb_22050_long
Chris@0 219
Chris@0 220 static
Chris@0 221 unsigned char const sfb_24000_short[] = {
Chris@0 222 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8,
Chris@0 223 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
Chris@0 224 18, 24, 24, 24, 32, 32, 32, 44, 44, 44, 12, 12, 12
Chris@0 225 };
Chris@0 226
Chris@0 227 static
Chris@0 228 unsigned char const sfb_22050_short[] = {
Chris@0 229 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 6,
Chris@0 230 6, 6, 8, 8, 8, 10, 10, 10, 14, 14, 14, 18, 18,
Chris@0 231 18, 26, 26, 26, 32, 32, 32, 42, 42, 42, 18, 18, 18
Chris@0 232 };
Chris@0 233
Chris@0 234 static
Chris@0 235 unsigned char const sfb_16000_short[] = {
Chris@0 236 4, 4, 4, 4, 4, 4, 4, 4, 4, 6, 6, 6, 8,
Chris@0 237 8, 8, 10, 10, 10, 12, 12, 12, 14, 14, 14, 18, 18,
Chris@0 238 18, 24, 24, 24, 30, 30, 30, 40, 40, 40, 18, 18, 18
Chris@0 239 };
Chris@0 240
Chris@0 241 static
Chris@0 242 unsigned char const sfb_24000_mixed[] = {
Chris@0 243 /* long */ 6, 6, 6, 6, 6, 6,
Chris@0 244 /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12,
Chris@0 245 12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
Chris@0 246 24, 32, 32, 32, 44, 44, 44, 12, 12, 12
Chris@0 247 };
Chris@0 248
Chris@0 249 static
Chris@0 250 unsigned char const sfb_22050_mixed[] = {
Chris@0 251 /* long */ 6, 6, 6, 6, 6, 6,
Chris@0 252 /* short */ 6, 6, 6, 6, 6, 6, 8, 8, 8, 10,
Chris@0 253 10, 10, 14, 14, 14, 18, 18, 18, 26, 26,
Chris@0 254 26, 32, 32, 32, 42, 42, 42, 18, 18, 18
Chris@0 255 };
Chris@0 256
Chris@0 257 static
Chris@0 258 unsigned char const sfb_16000_mixed[] = {
Chris@0 259 /* long */ 6, 6, 6, 6, 6, 6,
Chris@0 260 /* short */ 6, 6, 6, 8, 8, 8, 10, 10, 10, 12,
Chris@0 261 12, 12, 14, 14, 14, 18, 18, 18, 24, 24,
Chris@0 262 24, 30, 30, 30, 40, 40, 40, 18, 18, 18
Chris@0 263 };
Chris@0 264
Chris@0 265 /*
Chris@0 266 * MPEG 2.5 scalefactor band widths
Chris@0 267 * derived from public sources
Chris@0 268 */
Chris@0 269 # define sfb_12000_long sfb_16000_long
Chris@0 270 # define sfb_11025_long sfb_12000_long
Chris@0 271
Chris@0 272 static
Chris@0 273 unsigned char const sfb_8000_long[] = {
Chris@0 274 12, 12, 12, 12, 12, 12, 16, 20, 24, 28, 32,
Chris@0 275 40, 48, 56, 64, 76, 90, 2, 2, 2, 2, 2
Chris@0 276 };
Chris@0 277
Chris@0 278 # define sfb_12000_short sfb_16000_short
Chris@0 279 # define sfb_11025_short sfb_12000_short
Chris@0 280
Chris@0 281 static
Chris@0 282 unsigned char const sfb_8000_short[] = {
Chris@0 283 8, 8, 8, 8, 8, 8, 8, 8, 8, 12, 12, 12, 16,
Chris@0 284 16, 16, 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36,
Chris@0 285 36, 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26
Chris@0 286 };
Chris@0 287
Chris@0 288 # define sfb_12000_mixed sfb_16000_mixed
Chris@0 289 # define sfb_11025_mixed sfb_12000_mixed
Chris@0 290
Chris@0 291 /* the 8000 Hz short block scalefactor bands do not break after
Chris@0 292 the first 36 frequency lines, so this is probably wrong */
Chris@0 293 static
Chris@0 294 unsigned char const sfb_8000_mixed[] = {
Chris@0 295 /* long */ 12, 12, 12,
Chris@0 296 /* short */ 4, 4, 4, 8, 8, 8, 12, 12, 12, 16, 16, 16,
Chris@0 297 20, 20, 20, 24, 24, 24, 28, 28, 28, 36, 36, 36,
Chris@0 298 2, 2, 2, 2, 2, 2, 2, 2, 2, 26, 26, 26
Chris@0 299 };
Chris@0 300
Chris@0 301 static
Chris@0 302 struct {
Chris@0 303 unsigned char const *l;
Chris@0 304 unsigned char const *s;
Chris@0 305 unsigned char const *m;
Chris@0 306 } const sfbwidth_table[9] = {
Chris@0 307 { sfb_48000_long, sfb_48000_short, sfb_48000_mixed },
Chris@0 308 { sfb_44100_long, sfb_44100_short, sfb_44100_mixed },
Chris@0 309 { sfb_32000_long, sfb_32000_short, sfb_32000_mixed },
Chris@0 310 { sfb_24000_long, sfb_24000_short, sfb_24000_mixed },
Chris@0 311 { sfb_22050_long, sfb_22050_short, sfb_22050_mixed },
Chris@0 312 { sfb_16000_long, sfb_16000_short, sfb_16000_mixed },
Chris@0 313 { sfb_12000_long, sfb_12000_short, sfb_12000_mixed },
Chris@0 314 { sfb_11025_long, sfb_11025_short, sfb_11025_mixed },
Chris@0 315 { sfb_8000_long, sfb_8000_short, sfb_8000_mixed }
Chris@0 316 };
Chris@0 317
Chris@0 318 /*
Chris@0 319 * scalefactor band preemphasis (used only when preflag is set)
Chris@0 320 * derived from Table B.6 of ISO/IEC 11172-3
Chris@0 321 */
Chris@0 322 static
Chris@0 323 unsigned char const pretab[22] = {
Chris@0 324 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3, 2, 0
Chris@0 325 };
Chris@0 326
Chris@0 327 /*
Chris@0 328 * table for requantization
Chris@0 329 *
Chris@0 330 * rq_table[x].mantissa * 2^(rq_table[x].exponent) = x^(4/3)
Chris@0 331 */
Chris@0 332 static
Chris@0 333 struct fixedfloat {
Chris@0 334 unsigned long mantissa : 27;
Chris@0 335 unsigned short exponent : 5;
Chris@0 336 } const rq_table[8207] = {
Chris@0 337 # include "rq_table.dat"
Chris@0 338 };
Chris@0 339
Chris@0 340 /*
Chris@0 341 * fractional powers of two
Chris@0 342 * used for requantization and joint stereo decoding
Chris@0 343 *
Chris@0 344 * root_table[3 + x] = 2^(x/4)
Chris@0 345 */
Chris@0 346 static
Chris@0 347 mad_fixed_t const root_table[7] = {
Chris@0 348 MAD_F(0x09837f05) /* 2^(-3/4) == 0.59460355750136 */,
Chris@0 349 MAD_F(0x0b504f33) /* 2^(-2/4) == 0.70710678118655 */,
Chris@0 350 MAD_F(0x0d744fcd) /* 2^(-1/4) == 0.84089641525371 */,
Chris@0 351 MAD_F(0x10000000) /* 2^( 0/4) == 1.00000000000000 */,
Chris@0 352 MAD_F(0x1306fe0a) /* 2^(+1/4) == 1.18920711500272 */,
Chris@0 353 MAD_F(0x16a09e66) /* 2^(+2/4) == 1.41421356237310 */,
Chris@0 354 MAD_F(0x1ae89f99) /* 2^(+3/4) == 1.68179283050743 */
Chris@0 355 };
Chris@0 356
Chris@0 357 /*
Chris@0 358 * coefficients for aliasing reduction
Chris@0 359 * derived from Table B.9 of ISO/IEC 11172-3
Chris@0 360 *
Chris@0 361 * c[] = { -0.6, -0.535, -0.33, -0.185, -0.095, -0.041, -0.0142, -0.0037 }
Chris@0 362 * cs[i] = 1 / sqrt(1 + c[i]^2)
Chris@0 363 * ca[i] = c[i] / sqrt(1 + c[i]^2)
Chris@0 364 */
Chris@0 365 static
Chris@0 366 mad_fixed_t const cs[8] = {
Chris@0 367 +MAD_F(0x0db84a81) /* +0.857492926 */, +MAD_F(0x0e1b9d7f) /* +0.881741997 */,
Chris@0 368 +MAD_F(0x0f31adcf) /* +0.949628649 */, +MAD_F(0x0fbba815) /* +0.983314592 */,
Chris@0 369 +MAD_F(0x0feda417) /* +0.995517816 */, +MAD_F(0x0ffc8fc8) /* +0.999160558 */,
Chris@0 370 +MAD_F(0x0fff964c) /* +0.999899195 */, +MAD_F(0x0ffff8d3) /* +0.999993155 */
Chris@0 371 };
Chris@0 372
Chris@0 373 static
Chris@0 374 mad_fixed_t const ca[8] = {
Chris@0 375 -MAD_F(0x083b5fe7) /* -0.514495755 */, -MAD_F(0x078c36d2) /* -0.471731969 */,
Chris@0 376 -MAD_F(0x05039814) /* -0.313377454 */, -MAD_F(0x02e91dd1) /* -0.181913200 */,
Chris@0 377 -MAD_F(0x0183603a) /* -0.094574193 */, -MAD_F(0x00a7cb87) /* -0.040965583 */,
Chris@0 378 -MAD_F(0x003a2847) /* -0.014198569 */, -MAD_F(0x000f27b4) /* -0.003699975 */
Chris@0 379 };
Chris@0 380
Chris@0 381 /*
Chris@0 382 * IMDCT coefficients for short blocks
Chris@0 383 * derived from section 2.4.3.4.10.2 of ISO/IEC 11172-3
Chris@0 384 *
Chris@0 385 * imdct_s[i/even][k] = cos((PI / 24) * (2 * (i / 2) + 7) * (2 * k + 1))
Chris@0 386 * imdct_s[i /odd][k] = cos((PI / 24) * (2 * (6 + (i-1)/2) + 7) * (2 * k + 1))
Chris@0 387 */
Chris@0 388 static
Chris@0 389 mad_fixed_t const imdct_s[6][6] = {
Chris@0 390 # include "imdct_s.dat"
Chris@0 391 };
Chris@0 392
Chris@0 393 # if !defined(ASO_IMDCT)
Chris@0 394 /*
Chris@0 395 * windowing coefficients for long blocks
Chris@0 396 * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
Chris@0 397 *
Chris@0 398 * window_l[i] = sin((PI / 36) * (i + 1/2))
Chris@0 399 */
Chris@0 400 static
Chris@0 401 mad_fixed_t const window_l[36] = {
Chris@0 402 MAD_F(0x00b2aa3e) /* 0.043619387 */, MAD_F(0x0216a2a2) /* 0.130526192 */,
Chris@0 403 MAD_F(0x03768962) /* 0.216439614 */, MAD_F(0x04cfb0e2) /* 0.300705800 */,
Chris@0 404 MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x07635284) /* 0.461748613 */,
Chris@0 405 MAD_F(0x0898c779) /* 0.537299608 */, MAD_F(0x09bd7ca0) /* 0.608761429 */,
Chris@0 406 MAD_F(0x0acf37ad) /* 0.675590208 */, MAD_F(0x0bcbe352) /* 0.737277337 */,
Chris@0 407 MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x0d7e8807) /* 0.843391446 */,
Chris@0 408
Chris@0 409 MAD_F(0x0e313245) /* 0.887010833 */, MAD_F(0x0ec835e8) /* 0.923879533 */,
Chris@0 410 MAD_F(0x0f426cb5) /* 0.953716951 */, MAD_F(0x0f9ee890) /* 0.976296007 */,
Chris@0 411 MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ffc19fd) /* 0.999048222 */,
Chris@0 412 MAD_F(0x0ffc19fd) /* 0.999048222 */, MAD_F(0x0fdcf549) /* 0.991444861 */,
Chris@0 413 MAD_F(0x0f9ee890) /* 0.976296007 */, MAD_F(0x0f426cb5) /* 0.953716951 */,
Chris@0 414 MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0e313245) /* 0.887010833 */,
Chris@0 415
Chris@0 416 MAD_F(0x0d7e8807) /* 0.843391446 */, MAD_F(0x0cb19346) /* 0.793353340 */,
Chris@0 417 MAD_F(0x0bcbe352) /* 0.737277337 */, MAD_F(0x0acf37ad) /* 0.675590208 */,
Chris@0 418 MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0898c779) /* 0.537299608 */,
Chris@0 419 MAD_F(0x07635284) /* 0.461748613 */, MAD_F(0x061f78aa) /* 0.382683432 */,
Chris@0 420 MAD_F(0x04cfb0e2) /* 0.300705800 */, MAD_F(0x03768962) /* 0.216439614 */,
Chris@0 421 MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x00b2aa3e) /* 0.043619387 */,
Chris@0 422 };
Chris@0 423 # endif /* ASO_IMDCT */
Chris@0 424
Chris@0 425 /*
Chris@0 426 * windowing coefficients for short blocks
Chris@0 427 * derived from section 2.4.3.4.10.3 of ISO/IEC 11172-3
Chris@0 428 *
Chris@0 429 * window_s[i] = sin((PI / 12) * (i + 1/2))
Chris@0 430 */
Chris@0 431 static
Chris@0 432 mad_fixed_t const window_s[12] = {
Chris@0 433 MAD_F(0x0216a2a2) /* 0.130526192 */, MAD_F(0x061f78aa) /* 0.382683432 */,
Chris@0 434 MAD_F(0x09bd7ca0) /* 0.608761429 */, MAD_F(0x0cb19346) /* 0.793353340 */,
Chris@0 435 MAD_F(0x0ec835e8) /* 0.923879533 */, MAD_F(0x0fdcf549) /* 0.991444861 */,
Chris@0 436 MAD_F(0x0fdcf549) /* 0.991444861 */, MAD_F(0x0ec835e8) /* 0.923879533 */,
Chris@0 437 MAD_F(0x0cb19346) /* 0.793353340 */, MAD_F(0x09bd7ca0) /* 0.608761429 */,
Chris@0 438 MAD_F(0x061f78aa) /* 0.382683432 */, MAD_F(0x0216a2a2) /* 0.130526192 */,
Chris@0 439 };
Chris@0 440
Chris@0 441 /*
Chris@0 442 * coefficients for intensity stereo processing
Chris@0 443 * derived from section 2.4.3.4.9.3 of ISO/IEC 11172-3
Chris@0 444 *
Chris@0 445 * is_ratio[i] = tan(i * (PI / 12))
Chris@0 446 * is_table[i] = is_ratio[i] / (1 + is_ratio[i])
Chris@0 447 */
Chris@0 448 static
Chris@0 449 mad_fixed_t const is_table[7] = {
Chris@0 450 MAD_F(0x00000000) /* 0.000000000 */,
Chris@0 451 MAD_F(0x0361962f) /* 0.211324865 */,
Chris@0 452 MAD_F(0x05db3d74) /* 0.366025404 */,
Chris@0 453 MAD_F(0x08000000) /* 0.500000000 */,
Chris@0 454 MAD_F(0x0a24c28c) /* 0.633974596 */,
Chris@0 455 MAD_F(0x0c9e69d1) /* 0.788675135 */,
Chris@0 456 MAD_F(0x10000000) /* 1.000000000 */
Chris@0 457 };
Chris@0 458
Chris@0 459 /*
Chris@0 460 * coefficients for LSF intensity stereo processing
Chris@0 461 * derived from section 2.4.3.2 of ISO/IEC 13818-3
Chris@0 462 *
Chris@0 463 * is_lsf_table[0][i] = (1 / sqrt(sqrt(2)))^(i + 1)
Chris@0 464 * is_lsf_table[1][i] = (1 / sqrt(2)) ^(i + 1)
Chris@0 465 */
Chris@0 466 static
Chris@0 467 mad_fixed_t const is_lsf_table[2][15] = {
Chris@0 468 {
Chris@0 469 MAD_F(0x0d744fcd) /* 0.840896415 */,
Chris@0 470 MAD_F(0x0b504f33) /* 0.707106781 */,
Chris@0 471 MAD_F(0x09837f05) /* 0.594603558 */,
Chris@0 472 MAD_F(0x08000000) /* 0.500000000 */,
Chris@0 473 MAD_F(0x06ba27e6) /* 0.420448208 */,
Chris@0 474 MAD_F(0x05a8279a) /* 0.353553391 */,
Chris@0 475 MAD_F(0x04c1bf83) /* 0.297301779 */,
Chris@0 476 MAD_F(0x04000000) /* 0.250000000 */,
Chris@0 477 MAD_F(0x035d13f3) /* 0.210224104 */,
Chris@0 478 MAD_F(0x02d413cd) /* 0.176776695 */,
Chris@0 479 MAD_F(0x0260dfc1) /* 0.148650889 */,
Chris@0 480 MAD_F(0x02000000) /* 0.125000000 */,
Chris@0 481 MAD_F(0x01ae89fa) /* 0.105112052 */,
Chris@0 482 MAD_F(0x016a09e6) /* 0.088388348 */,
Chris@0 483 MAD_F(0x01306fe1) /* 0.074325445 */
Chris@0 484 }, {
Chris@0 485 MAD_F(0x0b504f33) /* 0.707106781 */,
Chris@0 486 MAD_F(0x08000000) /* 0.500000000 */,
Chris@0 487 MAD_F(0x05a8279a) /* 0.353553391 */,
Chris@0 488 MAD_F(0x04000000) /* 0.250000000 */,
Chris@0 489 MAD_F(0x02d413cd) /* 0.176776695 */,
Chris@0 490 MAD_F(0x02000000) /* 0.125000000 */,
Chris@0 491 MAD_F(0x016a09e6) /* 0.088388348 */,
Chris@0 492 MAD_F(0x01000000) /* 0.062500000 */,
Chris@0 493 MAD_F(0x00b504f3) /* 0.044194174 */,
Chris@0 494 MAD_F(0x00800000) /* 0.031250000 */,
Chris@0 495 MAD_F(0x005a827a) /* 0.022097087 */,
Chris@0 496 MAD_F(0x00400000) /* 0.015625000 */,
Chris@0 497 MAD_F(0x002d413d) /* 0.011048543 */,
Chris@0 498 MAD_F(0x00200000) /* 0.007812500 */,
Chris@0 499 MAD_F(0x0016a09e) /* 0.005524272 */
Chris@0 500 }
Chris@0 501 };
Chris@0 502
Chris@0 503 /*
Chris@0 504 * NAME: III_sideinfo()
Chris@0 505 * DESCRIPTION: decode frame side information from a bitstream
Chris@0 506 */
Chris@0 507 static
Chris@0 508 enum mad_error III_sideinfo(struct mad_bitptr *ptr, unsigned int nch,
Chris@0 509 int lsf, struct sideinfo *si,
Chris@0 510 unsigned int *data_bitlen,
Chris@0 511 unsigned int *priv_bitlen)
Chris@0 512 {
Chris@0 513 unsigned int ngr, gr, ch, i;
Chris@0 514 enum mad_error result = MAD_ERROR_NONE;
Chris@0 515
Chris@0 516 *data_bitlen = 0;
Chris@0 517 *priv_bitlen = lsf ? ((nch == 1) ? 1 : 2) : ((nch == 1) ? 5 : 3);
Chris@0 518
Chris@0 519 si->main_data_begin = mad_bit_read(ptr, lsf ? 8 : 9);
Chris@0 520 si->private_bits = mad_bit_read(ptr, *priv_bitlen);
Chris@0 521
Chris@0 522 ngr = 1;
Chris@0 523 if (!lsf) {
Chris@0 524 ngr = 2;
Chris@0 525
Chris@0 526 for (ch = 0; ch < nch; ++ch)
Chris@0 527 si->scfsi[ch] = mad_bit_read(ptr, 4);
Chris@0 528 }
Chris@0 529
Chris@0 530 for (gr = 0; gr < ngr; ++gr) {
Chris@0 531 struct granule *granule = &si->gr[gr];
Chris@0 532
Chris@0 533 for (ch = 0; ch < nch; ++ch) {
Chris@0 534 struct channel *channel = &granule->ch[ch];
Chris@0 535
Chris@0 536 channel->part2_3_length = mad_bit_read(ptr, 12);
Chris@0 537 channel->big_values = mad_bit_read(ptr, 9);
Chris@0 538 channel->global_gain = mad_bit_read(ptr, 8);
Chris@0 539 channel->scalefac_compress = mad_bit_read(ptr, lsf ? 9 : 4);
Chris@0 540
Chris@0 541 *data_bitlen += channel->part2_3_length;
Chris@0 542
Chris@0 543 if (channel->big_values > 288 && result == 0)
Chris@0 544 result = MAD_ERROR_BADBIGVALUES;
Chris@0 545
Chris@0 546 channel->flags = 0;
Chris@0 547
Chris@0 548 /* window_switching_flag */
Chris@0 549 if (mad_bit_read(ptr, 1)) {
Chris@0 550 channel->block_type = mad_bit_read(ptr, 2);
Chris@0 551
Chris@0 552 if (channel->block_type == 0 && result == 0)
Chris@0 553 result = MAD_ERROR_BADBLOCKTYPE;
Chris@0 554
Chris@0 555 if (!lsf && channel->block_type == 2 && si->scfsi[ch] && result == 0)
Chris@0 556 result = MAD_ERROR_BADSCFSI;
Chris@0 557
Chris@0 558 channel->region0_count = 7;
Chris@0 559 channel->region1_count = 36;
Chris@0 560
Chris@0 561 if (mad_bit_read(ptr, 1))
Chris@0 562 channel->flags |= mixed_block_flag;
Chris@0 563 else if (channel->block_type == 2)
Chris@0 564 channel->region0_count = 8;
Chris@0 565
Chris@0 566 for (i = 0; i < 2; ++i)
Chris@0 567 channel->table_select[i] = mad_bit_read(ptr, 5);
Chris@0 568
Chris@0 569 # if defined(DEBUG)
Chris@0 570 channel->table_select[2] = 4; /* not used */
Chris@0 571 # endif
Chris@0 572
Chris@0 573 for (i = 0; i < 3; ++i)
Chris@0 574 channel->subblock_gain[i] = mad_bit_read(ptr, 3);
Chris@0 575 }
Chris@0 576 else {
Chris@0 577 channel->block_type = 0;
Chris@0 578
Chris@0 579 for (i = 0; i < 3; ++i)
Chris@0 580 channel->table_select[i] = mad_bit_read(ptr, 5);
Chris@0 581
Chris@0 582 channel->region0_count = mad_bit_read(ptr, 4);
Chris@0 583 channel->region1_count = mad_bit_read(ptr, 3);
Chris@0 584 }
Chris@0 585
Chris@0 586 /* [preflag,] scalefac_scale, count1table_select */
Chris@0 587 channel->flags |= mad_bit_read(ptr, lsf ? 2 : 3);
Chris@0 588 }
Chris@0 589 }
Chris@0 590
Chris@0 591 return result;
Chris@0 592 }
Chris@0 593
Chris@0 594 /*
Chris@0 595 * NAME: III_scalefactors_lsf()
Chris@0 596 * DESCRIPTION: decode channel scalefactors for LSF from a bitstream
Chris@0 597 */
Chris@0 598 static
Chris@0 599 unsigned int III_scalefactors_lsf(struct mad_bitptr *ptr,
Chris@0 600 struct channel *channel,
Chris@0 601 struct channel *gr1ch, int mode_extension)
Chris@0 602 {
Chris@0 603 struct mad_bitptr start;
Chris@0 604 unsigned int scalefac_compress, index, slen[4], part, n, i;
Chris@0 605 unsigned char const *nsfb;
Chris@0 606
Chris@0 607 start = *ptr;
Chris@0 608
Chris@0 609 scalefac_compress = channel->scalefac_compress;
Chris@0 610 index = (channel->block_type == 2) ?
Chris@0 611 ((channel->flags & mixed_block_flag) ? 2 : 1) : 0;
Chris@0 612
Chris@0 613 if (!((mode_extension & I_STEREO) && gr1ch)) {
Chris@0 614 if (scalefac_compress < 400) {
Chris@0 615 slen[0] = (scalefac_compress >> 4) / 5;
Chris@0 616 slen[1] = (scalefac_compress >> 4) % 5;
Chris@0 617 slen[2] = (scalefac_compress % 16) >> 2;
Chris@0 618 slen[3] = scalefac_compress % 4;
Chris@0 619
Chris@0 620 nsfb = nsfb_table[0][index];
Chris@0 621 }
Chris@0 622 else if (scalefac_compress < 500) {
Chris@0 623 scalefac_compress -= 400;
Chris@0 624
Chris@0 625 slen[0] = (scalefac_compress >> 2) / 5;
Chris@0 626 slen[1] = (scalefac_compress >> 2) % 5;
Chris@0 627 slen[2] = scalefac_compress % 4;
Chris@0 628 slen[3] = 0;
Chris@0 629
Chris@0 630 nsfb = nsfb_table[1][index];
Chris@0 631 }
Chris@0 632 else {
Chris@0 633 scalefac_compress -= 500;
Chris@0 634
Chris@0 635 slen[0] = scalefac_compress / 3;
Chris@0 636 slen[1] = scalefac_compress % 3;
Chris@0 637 slen[2] = 0;
Chris@0 638 slen[3] = 0;
Chris@0 639
Chris@0 640 channel->flags |= preflag;
Chris@0 641
Chris@0 642 nsfb = nsfb_table[2][index];
Chris@0 643 }
Chris@0 644
Chris@0 645 n = 0;
Chris@0 646 for (part = 0; part < 4; ++part) {
Chris@0 647 for (i = 0; i < nsfb[part]; ++i)
Chris@0 648 channel->scalefac[n++] = mad_bit_read(ptr, slen[part]);
Chris@0 649 }
Chris@0 650
Chris@0 651 while (n < 39)
Chris@0 652 channel->scalefac[n++] = 0;
Chris@0 653 }
Chris@0 654 else { /* (mode_extension & I_STEREO) && gr1ch (i.e. ch == 1) */
Chris@0 655 scalefac_compress >>= 1;
Chris@0 656
Chris@0 657 if (scalefac_compress < 180) {
Chris@0 658 slen[0] = scalefac_compress / 36;
Chris@0 659 slen[1] = (scalefac_compress % 36) / 6;
Chris@0 660 slen[2] = (scalefac_compress % 36) % 6;
Chris@0 661 slen[3] = 0;
Chris@0 662
Chris@0 663 nsfb = nsfb_table[3][index];
Chris@0 664 }
Chris@0 665 else if (scalefac_compress < 244) {
Chris@0 666 scalefac_compress -= 180;
Chris@0 667
Chris@0 668 slen[0] = (scalefac_compress % 64) >> 4;
Chris@0 669 slen[1] = (scalefac_compress % 16) >> 2;
Chris@0 670 slen[2] = scalefac_compress % 4;
Chris@0 671 slen[3] = 0;
Chris@0 672
Chris@0 673 nsfb = nsfb_table[4][index];
Chris@0 674 }
Chris@0 675 else {
Chris@0 676 scalefac_compress -= 244;
Chris@0 677
Chris@0 678 slen[0] = scalefac_compress / 3;
Chris@0 679 slen[1] = scalefac_compress % 3;
Chris@0 680 slen[2] = 0;
Chris@0 681 slen[3] = 0;
Chris@0 682
Chris@0 683 nsfb = nsfb_table[5][index];
Chris@0 684 }
Chris@0 685
Chris@0 686 n = 0;
Chris@0 687 for (part = 0; part < 4; ++part) {
Chris@0 688 unsigned int max, is_pos;
Chris@0 689
Chris@0 690 max = (1 << slen[part]) - 1;
Chris@0 691
Chris@0 692 for (i = 0; i < nsfb[part]; ++i) {
Chris@0 693 is_pos = mad_bit_read(ptr, slen[part]);
Chris@0 694
Chris@0 695 channel->scalefac[n] = is_pos;
Chris@0 696 gr1ch->scalefac[n++] = (is_pos == max);
Chris@0 697 }
Chris@0 698 }
Chris@0 699
Chris@0 700 while (n < 39) {
Chris@0 701 channel->scalefac[n] = 0;
Chris@0 702 gr1ch->scalefac[n++] = 0; /* apparently not illegal */
Chris@0 703 }
Chris@0 704 }
Chris@0 705
Chris@0 706 return mad_bit_length(&start, ptr);
Chris@0 707 }
Chris@0 708
Chris@0 709 /*
Chris@0 710 * NAME: III_scalefactors()
Chris@0 711 * DESCRIPTION: decode channel scalefactors of one granule from a bitstream
Chris@0 712 */
Chris@0 713 static
Chris@0 714 unsigned int III_scalefactors(struct mad_bitptr *ptr, struct channel *channel,
Chris@0 715 struct channel const *gr0ch, unsigned int scfsi)
Chris@0 716 {
Chris@0 717 struct mad_bitptr start;
Chris@0 718 unsigned int slen1, slen2, sfbi;
Chris@0 719
Chris@0 720 start = *ptr;
Chris@0 721
Chris@0 722 slen1 = sflen_table[channel->scalefac_compress].slen1;
Chris@0 723 slen2 = sflen_table[channel->scalefac_compress].slen2;
Chris@0 724
Chris@0 725 if (channel->block_type == 2) {
Chris@0 726 unsigned int nsfb;
Chris@0 727
Chris@0 728 sfbi = 0;
Chris@0 729
Chris@0 730 nsfb = (channel->flags & mixed_block_flag) ? 8 + 3 * 3 : 6 * 3;
Chris@0 731 while (nsfb--)
Chris@0 732 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen1);
Chris@0 733
Chris@0 734 nsfb = 6 * 3;
Chris@0 735 while (nsfb--)
Chris@0 736 channel->scalefac[sfbi++] = mad_bit_read(ptr, slen2);
Chris@0 737
Chris@0 738 nsfb = 1 * 3;
Chris@0 739 while (nsfb--)
Chris@0 740 channel->scalefac[sfbi++] = 0;
Chris@0 741 }
Chris@0 742 else { /* channel->block_type != 2 */
Chris@0 743 if (scfsi & 0x8) {
Chris@0 744 for (sfbi = 0; sfbi < 6; ++sfbi)
Chris@0 745 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
Chris@0 746 }
Chris@0 747 else {
Chris@0 748 for (sfbi = 0; sfbi < 6; ++sfbi)
Chris@0 749 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
Chris@0 750 }
Chris@0 751
Chris@0 752 if (scfsi & 0x4) {
Chris@0 753 for (sfbi = 6; sfbi < 11; ++sfbi)
Chris@0 754 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
Chris@0 755 }
Chris@0 756 else {
Chris@0 757 for (sfbi = 6; sfbi < 11; ++sfbi)
Chris@0 758 channel->scalefac[sfbi] = mad_bit_read(ptr, slen1);
Chris@0 759 }
Chris@0 760
Chris@0 761 if (scfsi & 0x2) {
Chris@0 762 for (sfbi = 11; sfbi < 16; ++sfbi)
Chris@0 763 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
Chris@0 764 }
Chris@0 765 else {
Chris@0 766 for (sfbi = 11; sfbi < 16; ++sfbi)
Chris@0 767 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
Chris@0 768 }
Chris@0 769
Chris@0 770 if (scfsi & 0x1) {
Chris@0 771 for (sfbi = 16; sfbi < 21; ++sfbi)
Chris@0 772 channel->scalefac[sfbi] = gr0ch->scalefac[sfbi];
Chris@0 773 }
Chris@0 774 else {
Chris@0 775 for (sfbi = 16; sfbi < 21; ++sfbi)
Chris@0 776 channel->scalefac[sfbi] = mad_bit_read(ptr, slen2);
Chris@0 777 }
Chris@0 778
Chris@0 779 channel->scalefac[21] = 0;
Chris@0 780 }
Chris@0 781
Chris@0 782 return mad_bit_length(&start, ptr);
Chris@0 783 }
Chris@0 784
Chris@0 785 /*
Chris@0 786 * The Layer III formula for requantization and scaling is defined by
Chris@0 787 * section 2.4.3.4.7.1 of ISO/IEC 11172-3, as follows:
Chris@0 788 *
Chris@0 789 * long blocks:
Chris@0 790 * xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
Chris@0 791 * 2^((1/4) * (global_gain - 210)) *
Chris@0 792 * 2^-(scalefac_multiplier *
Chris@0 793 * (scalefac_l[sfb] + preflag * pretab[sfb]))
Chris@0 794 *
Chris@0 795 * short blocks:
Chris@0 796 * xr[i] = sign(is[i]) * abs(is[i])^(4/3) *
Chris@0 797 * 2^((1/4) * (global_gain - 210 - 8 * subblock_gain[w])) *
Chris@0 798 * 2^-(scalefac_multiplier * scalefac_s[sfb][w])
Chris@0 799 *
Chris@0 800 * where:
Chris@0 801 * scalefac_multiplier = (scalefac_scale + 1) / 2
Chris@0 802 *
Chris@0 803 * The routines III_exponents() and III_requantize() facilitate this
Chris@0 804 * calculation.
Chris@0 805 */
Chris@0 806
Chris@0 807 /*
Chris@0 808 * NAME: III_exponents()
Chris@0 809 * DESCRIPTION: calculate scalefactor exponents
Chris@0 810 */
Chris@0 811 static
Chris@0 812 void III_exponents(struct channel const *channel,
Chris@0 813 unsigned char const *sfbwidth, signed int exponents[39])
Chris@0 814 {
Chris@0 815 signed int gain;
Chris@0 816 unsigned int scalefac_multiplier, sfbi;
Chris@0 817
Chris@0 818 gain = (signed int) channel->global_gain - 210;
Chris@0 819 scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1;
Chris@0 820
Chris@0 821 if (channel->block_type == 2) {
Chris@0 822 unsigned int l;
Chris@0 823 signed int gain0, gain1, gain2;
Chris@0 824
Chris@0 825 sfbi = l = 0;
Chris@0 826
Chris@0 827 if (channel->flags & mixed_block_flag) {
Chris@0 828 unsigned int premask;
Chris@0 829
Chris@0 830 premask = (channel->flags & preflag) ? ~0 : 0;
Chris@0 831
Chris@0 832 /* long block subbands 0-1 */
Chris@0 833
Chris@0 834 while (l < 36) {
Chris@0 835 exponents[sfbi] = gain -
Chris@0 836 (signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) <<
Chris@0 837 scalefac_multiplier);
Chris@0 838
Chris@0 839 l += sfbwidth[sfbi++];
Chris@0 840 }
Chris@0 841 }
Chris@0 842
Chris@0 843 /* this is probably wrong for 8000 Hz short/mixed blocks */
Chris@0 844
Chris@0 845 gain0 = gain - 8 * (signed int) channel->subblock_gain[0];
Chris@0 846 gain1 = gain - 8 * (signed int) channel->subblock_gain[1];
Chris@0 847 gain2 = gain - 8 * (signed int) channel->subblock_gain[2];
Chris@0 848
Chris@0 849 while (l < 576) {
Chris@0 850 exponents[sfbi + 0] = gain0 -
Chris@0 851 (signed int) (channel->scalefac[sfbi + 0] << scalefac_multiplier);
Chris@0 852 exponents[sfbi + 1] = gain1 -
Chris@0 853 (signed int) (channel->scalefac[sfbi + 1] << scalefac_multiplier);
Chris@0 854 exponents[sfbi + 2] = gain2 -
Chris@0 855 (signed int) (channel->scalefac[sfbi + 2] << scalefac_multiplier);
Chris@0 856
Chris@0 857 l += 3 * sfbwidth[sfbi];
Chris@0 858 sfbi += 3;
Chris@0 859 }
Chris@0 860 }
Chris@0 861 else { /* channel->block_type != 2 */
Chris@0 862 if (channel->flags & preflag) {
Chris@0 863 for (sfbi = 0; sfbi < 22; ++sfbi) {
Chris@0 864 exponents[sfbi] = gain -
Chris@0 865 (signed int) ((channel->scalefac[sfbi] + pretab[sfbi]) <<
Chris@0 866 scalefac_multiplier);
Chris@0 867 }
Chris@0 868 }
Chris@0 869 else {
Chris@0 870 for (sfbi = 0; sfbi < 22; ++sfbi) {
Chris@0 871 exponents[sfbi] = gain -
Chris@0 872 (signed int) (channel->scalefac[sfbi] << scalefac_multiplier);
Chris@0 873 }
Chris@0 874 }
Chris@0 875 }
Chris@0 876 }
Chris@0 877
Chris@0 878 /*
Chris@0 879 * NAME: III_requantize()
Chris@0 880 * DESCRIPTION: requantize one (positive) value
Chris@0 881 */
Chris@0 882 static
Chris@0 883 mad_fixed_t III_requantize(unsigned int value, signed int exp)
Chris@0 884 {
Chris@0 885 mad_fixed_t requantized;
Chris@0 886 signed int frac;
Chris@0 887 struct fixedfloat const *power;
Chris@0 888
Chris@0 889 frac = exp % 4; /* assumes sign(frac) == sign(exp) */
Chris@0 890 exp /= 4;
Chris@0 891
Chris@0 892 power = &rq_table[value];
Chris@0 893 requantized = power->mantissa;
Chris@0 894 exp += power->exponent;
Chris@0 895
Chris@0 896 if (exp < 0) {
Chris@0 897 if (-exp >= sizeof(mad_fixed_t) * CHAR_BIT) {
Chris@0 898 /* underflow */
Chris@0 899 requantized = 0;
Chris@0 900 }
Chris@0 901 else {
Chris@0 902 requantized += 1L << (-exp - 1);
Chris@0 903 requantized >>= -exp;
Chris@0 904 }
Chris@0 905 }
Chris@0 906 else {
Chris@0 907 if (exp >= 5) {
Chris@0 908 /* overflow */
Chris@0 909 # if defined(DEBUG)
Chris@0 910 fprintf(stderr, "requantize overflow (%f * 2^%d)\n",
Chris@0 911 mad_f_todouble(requantized), exp);
Chris@0 912 # endif
Chris@0 913 requantized = MAD_F_MAX;
Chris@0 914 }
Chris@0 915 else
Chris@0 916 requantized <<= exp;
Chris@0 917 }
Chris@0 918
Chris@0 919 return frac ? mad_f_mul(requantized, root_table[3 + frac]) : requantized;
Chris@0 920 }
Chris@0 921
Chris@0 922 /* we must take care that sz >= bits and sz < sizeof(long) lest bits == 0 */
Chris@0 923 # define MASK(cache, sz, bits) \
Chris@0 924 (((cache) >> ((sz) - (bits))) & ((1 << (bits)) - 1))
Chris@0 925 # define MASK1BIT(cache, sz) \
Chris@0 926 ((cache) & (1 << ((sz) - 1)))
Chris@0 927
Chris@0 928 /*
Chris@0 929 * NAME: III_huffdecode()
Chris@0 930 * DESCRIPTION: decode Huffman code words of one channel of one granule
Chris@0 931 */
Chris@0 932 static
Chris@0 933 enum mad_error III_huffdecode(struct mad_bitptr *ptr, mad_fixed_t xr[576],
Chris@0 934 struct channel *channel,
Chris@0 935 unsigned char const *sfbwidth,
Chris@0 936 unsigned int part2_length)
Chris@0 937 {
Chris@0 938 signed int exponents[39], exp;
Chris@0 939 signed int const *expptr;
Chris@0 940 struct mad_bitptr peek;
Chris@0 941 signed int bits_left, cachesz;
Chris@0 942 register mad_fixed_t *xrptr;
Chris@0 943 mad_fixed_t const *sfbound;
Chris@0 944 register unsigned long bitcache;
Chris@0 945
Chris@0 946 bits_left = (signed) channel->part2_3_length - (signed) part2_length;
Chris@0 947 if (bits_left < 0)
Chris@0 948 return MAD_ERROR_BADPART3LEN;
Chris@0 949
Chris@0 950 III_exponents(channel, sfbwidth, exponents);
Chris@0 951
Chris@0 952 peek = *ptr;
Chris@0 953 mad_bit_skip(ptr, bits_left);
Chris@0 954
Chris@0 955 /* align bit reads to byte boundaries */
Chris@0 956 cachesz = mad_bit_bitsleft(&peek);
Chris@0 957 cachesz += ((32 - 1 - 24) + (24 - cachesz)) & ~7;
Chris@0 958
Chris@0 959 bitcache = mad_bit_read(&peek, cachesz);
Chris@0 960 bits_left -= cachesz;
Chris@0 961
Chris@0 962 xrptr = &xr[0];
Chris@0 963
Chris@0 964 /* big_values */
Chris@0 965 {
Chris@0 966 unsigned int region, rcount;
Chris@0 967 struct hufftable const *entry;
Chris@0 968 union huffpair const *table;
Chris@0 969 unsigned int linbits, startbits, big_values, reqhits;
Chris@0 970 mad_fixed_t reqcache[16];
Chris@0 971
Chris@0 972 sfbound = xrptr + *sfbwidth++;
Chris@0 973 rcount = channel->region0_count + 1;
Chris@0 974
Chris@0 975 entry = &mad_huff_pair_table[channel->table_select[region = 0]];
Chris@0 976 table = entry->table;
Chris@0 977 linbits = entry->linbits;
Chris@0 978 startbits = entry->startbits;
Chris@0 979
Chris@0 980 if (table == 0)
Chris@0 981 return MAD_ERROR_BADHUFFTABLE;
Chris@0 982
Chris@0 983 expptr = &exponents[0];
Chris@0 984 exp = *expptr++;
Chris@0 985 reqhits = 0;
Chris@0 986
Chris@0 987 big_values = channel->big_values;
Chris@0 988
Chris@0 989 while (big_values-- && cachesz + bits_left > 0) {
Chris@0 990 union huffpair const *pair;
Chris@0 991 unsigned int clumpsz, value;
Chris@0 992 register mad_fixed_t requantized;
Chris@0 993
Chris@0 994 if (xrptr == sfbound) {
Chris@0 995 sfbound += *sfbwidth++;
Chris@0 996
Chris@0 997 /* change table if region boundary */
Chris@0 998
Chris@0 999 if (--rcount == 0) {
Chris@0 1000 if (region == 0)
Chris@0 1001 rcount = channel->region1_count + 1;
Chris@0 1002 else
Chris@0 1003 rcount = 0; /* all remaining */
Chris@0 1004
Chris@0 1005 entry = &mad_huff_pair_table[channel->table_select[++region]];
Chris@0 1006 table = entry->table;
Chris@0 1007 linbits = entry->linbits;
Chris@0 1008 startbits = entry->startbits;
Chris@0 1009
Chris@0 1010 if (table == 0)
Chris@0 1011 return MAD_ERROR_BADHUFFTABLE;
Chris@0 1012 }
Chris@0 1013
Chris@0 1014 if (exp != *expptr) {
Chris@0 1015 exp = *expptr;
Chris@0 1016 reqhits = 0;
Chris@0 1017 }
Chris@0 1018
Chris@0 1019 ++expptr;
Chris@0 1020 }
Chris@0 1021
Chris@0 1022 if (cachesz < 21) {
Chris@0 1023 unsigned int bits;
Chris@0 1024
Chris@0 1025 bits = ((32 - 1 - 21) + (21 - cachesz)) & ~7;
Chris@0 1026 bitcache = (bitcache << bits) | mad_bit_read(&peek, bits);
Chris@0 1027 cachesz += bits;
Chris@0 1028 bits_left -= bits;
Chris@0 1029 }
Chris@0 1030
Chris@0 1031 /* hcod (0..19) */
Chris@0 1032
Chris@0 1033 clumpsz = startbits;
Chris@0 1034 pair = &table[MASK(bitcache, cachesz, clumpsz)];
Chris@0 1035
Chris@0 1036 while (!pair->final) {
Chris@0 1037 cachesz -= clumpsz;
Chris@0 1038
Chris@0 1039 clumpsz = pair->ptr.bits;
Chris@0 1040 pair = &table[pair->ptr.offset + MASK(bitcache, cachesz, clumpsz)];
Chris@0 1041 }
Chris@0 1042
Chris@0 1043 cachesz -= pair->value.hlen;
Chris@0 1044
Chris@0 1045 if (linbits) {
Chris@0 1046 /* x (0..14) */
Chris@0 1047
Chris@0 1048 value = pair->value.x;
Chris@0 1049
Chris@0 1050 switch (value) {
Chris@0 1051 case 0:
Chris@0 1052 xrptr[0] = 0;
Chris@0 1053 break;
Chris@0 1054
Chris@0 1055 case 15:
Chris@0 1056 if (cachesz < linbits + 2) {
Chris@0 1057 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
Chris@0 1058 cachesz += 16;
Chris@0 1059 bits_left -= 16;
Chris@0 1060 }
Chris@0 1061
Chris@0 1062 value += MASK(bitcache, cachesz, linbits);
Chris@0 1063 cachesz -= linbits;
Chris@0 1064
Chris@0 1065 requantized = III_requantize(value, exp);
Chris@0 1066 goto x_final;
Chris@0 1067
Chris@0 1068 default:
Chris@0 1069 if (reqhits & (1 << value))
Chris@0 1070 requantized = reqcache[value];
Chris@0 1071 else {
Chris@0 1072 reqhits |= (1 << value);
Chris@0 1073 requantized = reqcache[value] = III_requantize(value, exp);
Chris@0 1074 }
Chris@0 1075
Chris@0 1076 x_final:
Chris@0 1077 xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
Chris@0 1078 -requantized : requantized;
Chris@0 1079 }
Chris@0 1080
Chris@0 1081 /* y (0..14) */
Chris@0 1082
Chris@0 1083 value = pair->value.y;
Chris@0 1084
Chris@0 1085 switch (value) {
Chris@0 1086 case 0:
Chris@0 1087 xrptr[1] = 0;
Chris@0 1088 break;
Chris@0 1089
Chris@0 1090 case 15:
Chris@0 1091 if (cachesz < linbits + 1) {
Chris@0 1092 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
Chris@0 1093 cachesz += 16;
Chris@0 1094 bits_left -= 16;
Chris@0 1095 }
Chris@0 1096
Chris@0 1097 value += MASK(bitcache, cachesz, linbits);
Chris@0 1098 cachesz -= linbits;
Chris@0 1099
Chris@0 1100 requantized = III_requantize(value, exp);
Chris@0 1101 goto y_final;
Chris@0 1102
Chris@0 1103 default:
Chris@0 1104 if (reqhits & (1 << value))
Chris@0 1105 requantized = reqcache[value];
Chris@0 1106 else {
Chris@0 1107 reqhits |= (1 << value);
Chris@0 1108 requantized = reqcache[value] = III_requantize(value, exp);
Chris@0 1109 }
Chris@0 1110
Chris@0 1111 y_final:
Chris@0 1112 xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
Chris@0 1113 -requantized : requantized;
Chris@0 1114 }
Chris@0 1115 }
Chris@0 1116 else {
Chris@0 1117 /* x (0..1) */
Chris@0 1118
Chris@0 1119 value = pair->value.x;
Chris@0 1120
Chris@0 1121 if (value == 0)
Chris@0 1122 xrptr[0] = 0;
Chris@0 1123 else {
Chris@0 1124 if (reqhits & (1 << value))
Chris@0 1125 requantized = reqcache[value];
Chris@0 1126 else {
Chris@0 1127 reqhits |= (1 << value);
Chris@0 1128 requantized = reqcache[value] = III_requantize(value, exp);
Chris@0 1129 }
Chris@0 1130
Chris@0 1131 xrptr[0] = MASK1BIT(bitcache, cachesz--) ?
Chris@0 1132 -requantized : requantized;
Chris@0 1133 }
Chris@0 1134
Chris@0 1135 /* y (0..1) */
Chris@0 1136
Chris@0 1137 value = pair->value.y;
Chris@0 1138
Chris@0 1139 if (value == 0)
Chris@0 1140 xrptr[1] = 0;
Chris@0 1141 else {
Chris@0 1142 if (reqhits & (1 << value))
Chris@0 1143 requantized = reqcache[value];
Chris@0 1144 else {
Chris@0 1145 reqhits |= (1 << value);
Chris@0 1146 requantized = reqcache[value] = III_requantize(value, exp);
Chris@0 1147 }
Chris@0 1148
Chris@0 1149 xrptr[1] = MASK1BIT(bitcache, cachesz--) ?
Chris@0 1150 -requantized : requantized;
Chris@0 1151 }
Chris@0 1152 }
Chris@0 1153
Chris@0 1154 xrptr += 2;
Chris@0 1155 }
Chris@0 1156 }
Chris@0 1157
Chris@0 1158 if (cachesz + bits_left < 0)
Chris@0 1159 return MAD_ERROR_BADHUFFDATA; /* big_values overrun */
Chris@0 1160
Chris@0 1161 /* count1 */
Chris@0 1162 {
Chris@0 1163 union huffquad const *table;
Chris@0 1164 register mad_fixed_t requantized;
Chris@0 1165
Chris@0 1166 table = mad_huff_quad_table[channel->flags & count1table_select];
Chris@0 1167
Chris@0 1168 requantized = III_requantize(1, exp);
Chris@0 1169
Chris@0 1170 while (cachesz + bits_left > 0 && xrptr <= &xr[572]) {
Chris@0 1171 union huffquad const *quad;
Chris@0 1172
Chris@0 1173 /* hcod (1..6) */
Chris@0 1174
Chris@0 1175 if (cachesz < 10) {
Chris@0 1176 bitcache = (bitcache << 16) | mad_bit_read(&peek, 16);
Chris@0 1177 cachesz += 16;
Chris@0 1178 bits_left -= 16;
Chris@0 1179 }
Chris@0 1180
Chris@0 1181 quad = &table[MASK(bitcache, cachesz, 4)];
Chris@0 1182
Chris@0 1183 /* quad tables guaranteed to have at most one extra lookup */
Chris@0 1184 if (!quad->final) {
Chris@0 1185 cachesz -= 4;
Chris@0 1186
Chris@0 1187 quad = &table[quad->ptr.offset +
Chris@0 1188 MASK(bitcache, cachesz, quad->ptr.bits)];
Chris@0 1189 }
Chris@0 1190
Chris@0 1191 cachesz -= quad->value.hlen;
Chris@0 1192
Chris@0 1193 if (xrptr == sfbound) {
Chris@0 1194 sfbound += *sfbwidth++;
Chris@0 1195
Chris@0 1196 if (exp != *expptr) {
Chris@0 1197 exp = *expptr;
Chris@0 1198 requantized = III_requantize(1, exp);
Chris@0 1199 }
Chris@0 1200
Chris@0 1201 ++expptr;
Chris@0 1202 }
Chris@0 1203
Chris@0 1204 /* v (0..1) */
Chris@0 1205
Chris@0 1206 xrptr[0] = quad->value.v ?
Chris@0 1207 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
Chris@0 1208
Chris@0 1209 /* w (0..1) */
Chris@0 1210
Chris@0 1211 xrptr[1] = quad->value.w ?
Chris@0 1212 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
Chris@0 1213
Chris@0 1214 xrptr += 2;
Chris@0 1215
Chris@0 1216 if (xrptr == sfbound) {
Chris@0 1217 sfbound += *sfbwidth++;
Chris@0 1218
Chris@0 1219 if (exp != *expptr) {
Chris@0 1220 exp = *expptr;
Chris@0 1221 requantized = III_requantize(1, exp);
Chris@0 1222 }
Chris@0 1223
Chris@0 1224 ++expptr;
Chris@0 1225 }
Chris@0 1226
Chris@0 1227 /* x (0..1) */
Chris@0 1228
Chris@0 1229 xrptr[0] = quad->value.x ?
Chris@0 1230 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
Chris@0 1231
Chris@0 1232 /* y (0..1) */
Chris@0 1233
Chris@0 1234 xrptr[1] = quad->value.y ?
Chris@0 1235 (MASK1BIT(bitcache, cachesz--) ? -requantized : requantized) : 0;
Chris@0 1236
Chris@0 1237 xrptr += 2;
Chris@0 1238 }
Chris@0 1239
Chris@0 1240 if (cachesz + bits_left < 0) {
Chris@0 1241 # if 0 && defined(DEBUG)
Chris@0 1242 fprintf(stderr, "huffman count1 overrun (%d bits)\n",
Chris@0 1243 -(cachesz + bits_left));
Chris@0 1244 # endif
Chris@0 1245
Chris@0 1246 /* technically the bitstream is misformatted, but apparently
Chris@0 1247 some encoders are just a bit sloppy with stuffing bits */
Chris@0 1248
Chris@0 1249 xrptr -= 4;
Chris@0 1250 }
Chris@0 1251 }
Chris@0 1252
Chris@0 1253 assert(-bits_left <= MAD_BUFFER_GUARD * CHAR_BIT);
Chris@0 1254
Chris@0 1255 # if 0 && defined(DEBUG)
Chris@0 1256 if (bits_left < 0)
Chris@0 1257 fprintf(stderr, "read %d bits too many\n", -bits_left);
Chris@0 1258 else if (cachesz + bits_left > 0)
Chris@0 1259 fprintf(stderr, "%d stuffing bits\n", cachesz + bits_left);
Chris@0 1260 # endif
Chris@0 1261
Chris@0 1262 /* rzero */
Chris@0 1263 while (xrptr < &xr[576]) {
Chris@0 1264 xrptr[0] = 0;
Chris@0 1265 xrptr[1] = 0;
Chris@0 1266
Chris@0 1267 xrptr += 2;
Chris@0 1268 }
Chris@0 1269
Chris@0 1270 return MAD_ERROR_NONE;
Chris@0 1271 }
Chris@0 1272
Chris@0 1273 # undef MASK
Chris@0 1274 # undef MASK1BIT
Chris@0 1275
Chris@0 1276 /*
Chris@0 1277 * NAME: III_reorder()
Chris@0 1278 * DESCRIPTION: reorder frequency lines of a short block into subband order
Chris@0 1279 */
Chris@0 1280 static
Chris@0 1281 void III_reorder(mad_fixed_t xr[576], struct channel const *channel,
Chris@0 1282 unsigned char const sfbwidth[39])
Chris@0 1283 {
Chris@0 1284 mad_fixed_t tmp[32][3][6];
Chris@0 1285 unsigned int sb, l, f, w, sbw[3], sw[3];
Chris@0 1286
Chris@0 1287 /* this is probably wrong for 8000 Hz mixed blocks */
Chris@0 1288
Chris@0 1289 sb = 0;
Chris@0 1290 if (channel->flags & mixed_block_flag) {
Chris@0 1291 sb = 2;
Chris@0 1292
Chris@0 1293 l = 0;
Chris@0 1294 while (l < 36)
Chris@0 1295 l += *sfbwidth++;
Chris@0 1296 }
Chris@0 1297
Chris@0 1298 for (w = 0; w < 3; ++w) {
Chris@0 1299 sbw[w] = sb;
Chris@0 1300 sw[w] = 0;
Chris@0 1301 }
Chris@0 1302
Chris@0 1303 f = *sfbwidth++;
Chris@0 1304 w = 0;
Chris@0 1305
Chris@0 1306 for (l = 18 * sb; l < 576; ++l) {
Chris@0 1307 if (f-- == 0) {
Chris@0 1308 f = *sfbwidth++ - 1;
Chris@0 1309 w = (w + 1) % 3;
Chris@0 1310 }
Chris@0 1311
Chris@0 1312 tmp[sbw[w]][w][sw[w]++] = xr[l];
Chris@0 1313
Chris@0 1314 if (sw[w] == 6) {
Chris@0 1315 sw[w] = 0;
Chris@0 1316 ++sbw[w];
Chris@0 1317 }
Chris@0 1318 }
Chris@0 1319
Chris@0 1320 memcpy(&xr[18 * sb], &tmp[sb], (576 - 18 * sb) * sizeof(mad_fixed_t));
Chris@0 1321 }
Chris@0 1322
Chris@0 1323 /*
Chris@0 1324 * NAME: III_stereo()
Chris@0 1325 * DESCRIPTION: perform joint stereo processing on a granule
Chris@0 1326 */
Chris@0 1327 static
Chris@0 1328 enum mad_error III_stereo(mad_fixed_t xr[2][576],
Chris@0 1329 struct granule const *granule,
Chris@0 1330 struct mad_header *header,
Chris@0 1331 unsigned char const *sfbwidth)
Chris@0 1332 {
Chris@0 1333 short modes[39];
Chris@0 1334 unsigned int sfbi, l, n, i;
Chris@0 1335
Chris@0 1336 if (granule->ch[0].block_type !=
Chris@0 1337 granule->ch[1].block_type ||
Chris@0 1338 (granule->ch[0].flags & mixed_block_flag) !=
Chris@0 1339 (granule->ch[1].flags & mixed_block_flag))
Chris@0 1340 return MAD_ERROR_BADSTEREO;
Chris@0 1341
Chris@0 1342 for (i = 0; i < 39; ++i)
Chris@0 1343 modes[i] = header->mode_extension;
Chris@0 1344
Chris@0 1345 /* intensity stereo */
Chris@0 1346
Chris@0 1347 if (header->mode_extension & I_STEREO) {
Chris@0 1348 struct channel const *right_ch = &granule->ch[1];
Chris@0 1349 mad_fixed_t const *right_xr = xr[1];
Chris@0 1350 unsigned int is_pos;
Chris@0 1351
Chris@0 1352 header->flags |= MAD_FLAG_I_STEREO;
Chris@0 1353
Chris@0 1354 /* first determine which scalefactor bands are to be processed */
Chris@0 1355
Chris@0 1356 if (right_ch->block_type == 2) {
Chris@0 1357 unsigned int lower, start, max, bound[3], w;
Chris@0 1358
Chris@0 1359 lower = start = max = bound[0] = bound[1] = bound[2] = 0;
Chris@0 1360
Chris@0 1361 sfbi = l = 0;
Chris@0 1362
Chris@0 1363 if (right_ch->flags & mixed_block_flag) {
Chris@0 1364 while (l < 36) {
Chris@0 1365 n = sfbwidth[sfbi++];
Chris@0 1366
Chris@0 1367 for (i = 0; i < n; ++i) {
Chris@0 1368 if (right_xr[i]) {
Chris@0 1369 lower = sfbi;
Chris@0 1370 break;
Chris@0 1371 }
Chris@0 1372 }
Chris@0 1373
Chris@0 1374 right_xr += n;
Chris@0 1375 l += n;
Chris@0 1376 }
Chris@0 1377
Chris@0 1378 start = sfbi;
Chris@0 1379 }
Chris@0 1380
Chris@0 1381 w = 0;
Chris@0 1382 while (l < 576) {
Chris@0 1383 n = sfbwidth[sfbi++];
Chris@0 1384
Chris@0 1385 for (i = 0; i < n; ++i) {
Chris@0 1386 if (right_xr[i]) {
Chris@0 1387 max = bound[w] = sfbi;
Chris@0 1388 break;
Chris@0 1389 }
Chris@0 1390 }
Chris@0 1391
Chris@0 1392 right_xr += n;
Chris@0 1393 l += n;
Chris@0 1394 w = (w + 1) % 3;
Chris@0 1395 }
Chris@0 1396
Chris@0 1397 if (max)
Chris@0 1398 lower = start;
Chris@0 1399
Chris@0 1400 /* long blocks */
Chris@0 1401
Chris@0 1402 for (i = 0; i < lower; ++i)
Chris@0 1403 modes[i] = header->mode_extension & ~I_STEREO;
Chris@0 1404
Chris@0 1405 /* short blocks */
Chris@0 1406
Chris@0 1407 w = 0;
Chris@0 1408 for (i = start; i < max; ++i) {
Chris@0 1409 if (i < bound[w])
Chris@0 1410 modes[i] = header->mode_extension & ~I_STEREO;
Chris@0 1411
Chris@0 1412 w = (w + 1) % 3;
Chris@0 1413 }
Chris@0 1414 }
Chris@0 1415 else { /* right_ch->block_type != 2 */
Chris@0 1416 unsigned int bound;
Chris@0 1417
Chris@0 1418 bound = 0;
Chris@0 1419 for (sfbi = l = 0; l < 576; l += n) {
Chris@0 1420 n = sfbwidth[sfbi++];
Chris@0 1421
Chris@0 1422 for (i = 0; i < n; ++i) {
Chris@0 1423 if (right_xr[i]) {
Chris@0 1424 bound = sfbi;
Chris@0 1425 break;
Chris@0 1426 }
Chris@0 1427 }
Chris@0 1428
Chris@0 1429 right_xr += n;
Chris@0 1430 }
Chris@0 1431
Chris@0 1432 for (i = 0; i < bound; ++i)
Chris@0 1433 modes[i] = header->mode_extension & ~I_STEREO;
Chris@0 1434 }
Chris@0 1435
Chris@0 1436 /* now do the actual processing */
Chris@0 1437
Chris@0 1438 if (header->flags & MAD_FLAG_LSF_EXT) {
Chris@0 1439 unsigned char const *illegal_pos = granule[1].ch[1].scalefac;
Chris@0 1440 mad_fixed_t const *lsf_scale;
Chris@0 1441
Chris@0 1442 /* intensity_scale */
Chris@0 1443 lsf_scale = is_lsf_table[right_ch->scalefac_compress & 0x1];
Chris@0 1444
Chris@0 1445 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
Chris@0 1446 n = sfbwidth[sfbi];
Chris@0 1447
Chris@0 1448 if (!(modes[sfbi] & I_STEREO))
Chris@0 1449 continue;
Chris@0 1450
Chris@0 1451 if (illegal_pos[sfbi]) {
Chris@0 1452 modes[sfbi] &= ~I_STEREO;
Chris@0 1453 continue;
Chris@0 1454 }
Chris@0 1455
Chris@0 1456 is_pos = right_ch->scalefac[sfbi];
Chris@0 1457
Chris@0 1458 for (i = 0; i < n; ++i) {
Chris@0 1459 register mad_fixed_t left;
Chris@0 1460
Chris@0 1461 left = xr[0][l + i];
Chris@0 1462
Chris@0 1463 if (is_pos == 0)
Chris@0 1464 xr[1][l + i] = left;
Chris@0 1465 else {
Chris@0 1466 register mad_fixed_t opposite;
Chris@0 1467
Chris@0 1468 opposite = mad_f_mul(left, lsf_scale[(is_pos - 1) / 2]);
Chris@0 1469
Chris@0 1470 if (is_pos & 1) {
Chris@0 1471 xr[0][l + i] = opposite;
Chris@0 1472 xr[1][l + i] = left;
Chris@0 1473 }
Chris@0 1474 else
Chris@0 1475 xr[1][l + i] = opposite;
Chris@0 1476 }
Chris@0 1477 }
Chris@0 1478 }
Chris@0 1479 }
Chris@0 1480 else { /* !(header->flags & MAD_FLAG_LSF_EXT) */
Chris@0 1481 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
Chris@0 1482 n = sfbwidth[sfbi];
Chris@0 1483
Chris@0 1484 if (!(modes[sfbi] & I_STEREO))
Chris@0 1485 continue;
Chris@0 1486
Chris@0 1487 is_pos = right_ch->scalefac[sfbi];
Chris@0 1488
Chris@0 1489 if (is_pos >= 7) { /* illegal intensity position */
Chris@0 1490 modes[sfbi] &= ~I_STEREO;
Chris@0 1491 continue;
Chris@0 1492 }
Chris@0 1493
Chris@0 1494 for (i = 0; i < n; ++i) {
Chris@0 1495 register mad_fixed_t left;
Chris@0 1496
Chris@0 1497 left = xr[0][l + i];
Chris@0 1498
Chris@0 1499 xr[0][l + i] = mad_f_mul(left, is_table[ is_pos]);
Chris@0 1500 xr[1][l + i] = mad_f_mul(left, is_table[6 - is_pos]);
Chris@0 1501 }
Chris@0 1502 }
Chris@0 1503 }
Chris@0 1504 }
Chris@0 1505
Chris@0 1506 /* middle/side stereo */
Chris@0 1507
Chris@0 1508 if (header->mode_extension & MS_STEREO) {
Chris@0 1509 register mad_fixed_t invsqrt2;
Chris@0 1510
Chris@0 1511 header->flags |= MAD_FLAG_MS_STEREO;
Chris@0 1512
Chris@0 1513 invsqrt2 = root_table[3 + -2];
Chris@0 1514
Chris@0 1515 for (sfbi = l = 0; l < 576; ++sfbi, l += n) {
Chris@0 1516 n = sfbwidth[sfbi];
Chris@0 1517
Chris@0 1518 if (modes[sfbi] != MS_STEREO)
Chris@0 1519 continue;
Chris@0 1520
Chris@0 1521 for (i = 0; i < n; ++i) {
Chris@0 1522 register mad_fixed_t m, s;
Chris@0 1523
Chris@0 1524 m = xr[0][l + i];
Chris@0 1525 s = xr[1][l + i];
Chris@0 1526
Chris@0 1527 xr[0][l + i] = mad_f_mul(m + s, invsqrt2); /* l = (m + s) / sqrt(2) */
Chris@0 1528 xr[1][l + i] = mad_f_mul(m - s, invsqrt2); /* r = (m - s) / sqrt(2) */
Chris@0 1529 }
Chris@0 1530 }
Chris@0 1531 }
Chris@0 1532
Chris@0 1533 return MAD_ERROR_NONE;
Chris@0 1534 }
Chris@0 1535
Chris@0 1536 /*
Chris@0 1537 * NAME: III_aliasreduce()
Chris@0 1538 * DESCRIPTION: perform frequency line alias reduction
Chris@0 1539 */
Chris@0 1540 static
Chris@0 1541 void III_aliasreduce(mad_fixed_t xr[576], int lines)
Chris@0 1542 {
Chris@0 1543 mad_fixed_t const *bound;
Chris@0 1544 int i;
Chris@0 1545
Chris@0 1546 bound = &xr[lines];
Chris@0 1547 for (xr += 18; xr < bound; xr += 18) {
Chris@0 1548 for (i = 0; i < 8; ++i) {
Chris@0 1549 register mad_fixed_t a, b;
Chris@0 1550 register mad_fixed64hi_t hi;
Chris@0 1551 register mad_fixed64lo_t lo;
Chris@0 1552
Chris@0 1553 a = xr[-1 - i];
Chris@0 1554 b = xr[ i];
Chris@0 1555
Chris@0 1556 # if defined(ASO_ZEROCHECK)
Chris@0 1557 if (a | b) {
Chris@0 1558 # endif
Chris@0 1559 MAD_F_ML0(hi, lo, a, cs[i]);
Chris@0 1560 MAD_F_MLA(hi, lo, -b, ca[i]);
Chris@0 1561
Chris@0 1562 xr[-1 - i] = MAD_F_MLZ(hi, lo);
Chris@0 1563
Chris@0 1564 MAD_F_ML0(hi, lo, b, cs[i]);
Chris@0 1565 MAD_F_MLA(hi, lo, a, ca[i]);
Chris@0 1566
Chris@0 1567 xr[ i] = MAD_F_MLZ(hi, lo);
Chris@0 1568 # if defined(ASO_ZEROCHECK)
Chris@0 1569 }
Chris@0 1570 # endif
Chris@0 1571 }
Chris@0 1572 }
Chris@0 1573 }
Chris@0 1574
Chris@0 1575 # if defined(ASO_IMDCT)
Chris@0 1576 void III_imdct_l(mad_fixed_t const [18], mad_fixed_t [36], unsigned int);
Chris@0 1577 # else
Chris@0 1578 # if 1
Chris@0 1579 static
Chris@0 1580 void fastsdct(mad_fixed_t const x[9], mad_fixed_t y[18])
Chris@0 1581 {
Chris@0 1582 mad_fixed_t a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12;
Chris@0 1583 mad_fixed_t a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25;
Chris@0 1584 mad_fixed_t m0, m1, m2, m3, m4, m5, m6, m7;
Chris@0 1585
Chris@0 1586 enum {
Chris@0 1587 c0 = MAD_F(0x1f838b8d), /* 2 * cos( 1 * PI / 18) */
Chris@0 1588 c1 = MAD_F(0x1bb67ae8), /* 2 * cos( 3 * PI / 18) */
Chris@0 1589 c2 = MAD_F(0x18836fa3), /* 2 * cos( 4 * PI / 18) */
Chris@0 1590 c3 = MAD_F(0x1491b752), /* 2 * cos( 5 * PI / 18) */
Chris@0 1591 c4 = MAD_F(0x0af1d43a), /* 2 * cos( 7 * PI / 18) */
Chris@0 1592 c5 = MAD_F(0x058e86a0), /* 2 * cos( 8 * PI / 18) */
Chris@0 1593 c6 = -MAD_F(0x1e11f642) /* 2 * cos(16 * PI / 18) */
Chris@0 1594 };
Chris@0 1595
Chris@0 1596 a0 = x[3] + x[5];
Chris@0 1597 a1 = x[3] - x[5];
Chris@0 1598 a2 = x[6] + x[2];
Chris@0 1599 a3 = x[6] - x[2];
Chris@0 1600 a4 = x[1] + x[7];
Chris@0 1601 a5 = x[1] - x[7];
Chris@0 1602 a6 = x[8] + x[0];
Chris@0 1603 a7 = x[8] - x[0];
Chris@0 1604
Chris@0 1605 a8 = a0 + a2;
Chris@0 1606 a9 = a0 - a2;
Chris@0 1607 a10 = a0 - a6;
Chris@0 1608 a11 = a2 - a6;
Chris@0 1609 a12 = a8 + a6;
Chris@0 1610 a13 = a1 - a3;
Chris@0 1611 a14 = a13 + a7;
Chris@0 1612 a15 = a3 + a7;
Chris@0 1613 a16 = a1 - a7;
Chris@0 1614 a17 = a1 + a3;
Chris@0 1615
Chris@0 1616 m0 = mad_f_mul(a17, -c3);
Chris@0 1617 m1 = mad_f_mul(a16, -c0);
Chris@0 1618 m2 = mad_f_mul(a15, -c4);
Chris@0 1619 m3 = mad_f_mul(a14, -c1);
Chris@0 1620 m4 = mad_f_mul(a5, -c1);
Chris@0 1621 m5 = mad_f_mul(a11, -c6);
Chris@0 1622 m6 = mad_f_mul(a10, -c5);
Chris@0 1623 m7 = mad_f_mul(a9, -c2);
Chris@0 1624
Chris@0 1625 a18 = x[4] + a4;
Chris@0 1626 a19 = 2 * x[4] - a4;
Chris@0 1627 a20 = a19 + m5;
Chris@0 1628 a21 = a19 - m5;
Chris@0 1629 a22 = a19 + m6;
Chris@0 1630 a23 = m4 + m2;
Chris@0 1631 a24 = m4 - m2;
Chris@0 1632 a25 = m4 + m1;
Chris@0 1633
Chris@0 1634 /* output to every other slot for convenience */
Chris@0 1635
Chris@0 1636 y[ 0] = a18 + a12;
Chris@0 1637 y[ 2] = m0 - a25;
Chris@0 1638 y[ 4] = m7 - a20;
Chris@0 1639 y[ 6] = m3;
Chris@0 1640 y[ 8] = a21 - m6;
Chris@0 1641 y[10] = a24 - m1;
Chris@0 1642 y[12] = a12 - 2 * a18;
Chris@0 1643 y[14] = a23 + m0;
Chris@0 1644 y[16] = a22 + m7;
Chris@0 1645 }
Chris@0 1646
Chris@0 1647 static inline
Chris@0 1648 void sdctII(mad_fixed_t const x[18], mad_fixed_t X[18])
Chris@0 1649 {
Chris@0 1650 mad_fixed_t tmp[9];
Chris@0 1651 int i;
Chris@0 1652
Chris@0 1653 /* scale[i] = 2 * cos(PI * (2 * i + 1) / (2 * 18)) */
Chris@0 1654 static mad_fixed_t const scale[9] = {
Chris@0 1655 MAD_F(0x1fe0d3b4), MAD_F(0x1ee8dd47), MAD_F(0x1d007930),
Chris@0 1656 MAD_F(0x1a367e59), MAD_F(0x16a09e66), MAD_F(0x125abcf8),
Chris@0 1657 MAD_F(0x0d8616bc), MAD_F(0x08483ee1), MAD_F(0x02c9fad7)
Chris@0 1658 };
Chris@0 1659
Chris@0 1660 /* divide the 18-point SDCT-II into two 9-point SDCT-IIs */
Chris@0 1661
Chris@0 1662 /* even input butterfly */
Chris@0 1663
Chris@0 1664 for (i = 0; i < 9; i += 3) {
Chris@0 1665 tmp[i + 0] = x[i + 0] + x[18 - (i + 0) - 1];
Chris@0 1666 tmp[i + 1] = x[i + 1] + x[18 - (i + 1) - 1];
Chris@0 1667 tmp[i + 2] = x[i + 2] + x[18 - (i + 2) - 1];
Chris@0 1668 }
Chris@0 1669
Chris@0 1670 fastsdct(tmp, &X[0]);
Chris@0 1671
Chris@0 1672 /* odd input butterfly and scaling */
Chris@0 1673
Chris@0 1674 for (i = 0; i < 9; i += 3) {
Chris@0 1675 tmp[i + 0] = mad_f_mul(x[i + 0] - x[18 - (i + 0) - 1], scale[i + 0]);
Chris@0 1676 tmp[i + 1] = mad_f_mul(x[i + 1] - x[18 - (i + 1) - 1], scale[i + 1]);
Chris@0 1677 tmp[i + 2] = mad_f_mul(x[i + 2] - x[18 - (i + 2) - 1], scale[i + 2]);
Chris@0 1678 }
Chris@0 1679
Chris@0 1680 fastsdct(tmp, &X[1]);
Chris@0 1681
Chris@0 1682 /* output accumulation */
Chris@0 1683
Chris@0 1684 for (i = 3; i < 18; i += 8) {
Chris@0 1685 X[i + 0] -= X[(i + 0) - 2];
Chris@0 1686 X[i + 2] -= X[(i + 2) - 2];
Chris@0 1687 X[i + 4] -= X[(i + 4) - 2];
Chris@0 1688 X[i + 6] -= X[(i + 6) - 2];
Chris@0 1689 }
Chris@0 1690 }
Chris@0 1691
Chris@0 1692 static inline
Chris@0 1693 void dctIV(mad_fixed_t const y[18], mad_fixed_t X[18])
Chris@0 1694 {
Chris@0 1695 mad_fixed_t tmp[18];
Chris@0 1696 int i;
Chris@0 1697
Chris@0 1698 /* scale[i] = 2 * cos(PI * (2 * i + 1) / (4 * 18)) */
Chris@0 1699 static mad_fixed_t const scale[18] = {
Chris@0 1700 MAD_F(0x1ff833fa), MAD_F(0x1fb9ea93), MAD_F(0x1f3dd120),
Chris@0 1701 MAD_F(0x1e84d969), MAD_F(0x1d906bcf), MAD_F(0x1c62648b),
Chris@0 1702 MAD_F(0x1afd100f), MAD_F(0x1963268b), MAD_F(0x1797c6a4),
Chris@0 1703 MAD_F(0x159e6f5b), MAD_F(0x137af940), MAD_F(0x11318ef3),
Chris@0 1704 MAD_F(0x0ec6a507), MAD_F(0x0c3ef153), MAD_F(0x099f61c5),
Chris@0 1705 MAD_F(0x06ed12c5), MAD_F(0x042d4544), MAD_F(0x0165547c)
Chris@0 1706 };
Chris@0 1707
Chris@0 1708 /* scaling */
Chris@0 1709
Chris@0 1710 for (i = 0; i < 18; i += 3) {
Chris@0 1711 tmp[i + 0] = mad_f_mul(y[i + 0], scale[i + 0]);
Chris@0 1712 tmp[i + 1] = mad_f_mul(y[i + 1], scale[i + 1]);
Chris@0 1713 tmp[i + 2] = mad_f_mul(y[i + 2], scale[i + 2]);
Chris@0 1714 }
Chris@0 1715
Chris@0 1716 /* SDCT-II */
Chris@0 1717
Chris@0 1718 sdctII(tmp, X);
Chris@0 1719
Chris@0 1720 /* scale reduction and output accumulation */
Chris@0 1721
Chris@0 1722 X[0] /= 2;
Chris@0 1723 for (i = 1; i < 17; i += 4) {
Chris@0 1724 X[i + 0] = X[i + 0] / 2 - X[(i + 0) - 1];
Chris@0 1725 X[i + 1] = X[i + 1] / 2 - X[(i + 1) - 1];
Chris@0 1726 X[i + 2] = X[i + 2] / 2 - X[(i + 2) - 1];
Chris@0 1727 X[i + 3] = X[i + 3] / 2 - X[(i + 3) - 1];
Chris@0 1728 }
Chris@0 1729 X[17] = X[17] / 2 - X[16];
Chris@0 1730 }
Chris@0 1731
Chris@0 1732 /*
Chris@0 1733 * NAME: imdct36
Chris@0 1734 * DESCRIPTION: perform X[18]->x[36] IMDCT using Szu-Wei Lee's fast algorithm
Chris@0 1735 */
Chris@0 1736 static inline
Chris@0 1737 void imdct36(mad_fixed_t const x[18], mad_fixed_t y[36])
Chris@0 1738 {
Chris@0 1739 mad_fixed_t tmp[18];
Chris@0 1740 int i;
Chris@0 1741
Chris@0 1742 /* DCT-IV */
Chris@0 1743
Chris@0 1744 dctIV(x, tmp);
Chris@0 1745
Chris@0 1746 /* convert 18-point DCT-IV to 36-point IMDCT */
Chris@0 1747
Chris@0 1748 for (i = 0; i < 9; i += 3) {
Chris@0 1749 y[i + 0] = tmp[9 + (i + 0)];
Chris@0 1750 y[i + 1] = tmp[9 + (i + 1)];
Chris@0 1751 y[i + 2] = tmp[9 + (i + 2)];
Chris@0 1752 }
Chris@0 1753 for (i = 9; i < 27; i += 3) {
Chris@0 1754 y[i + 0] = -tmp[36 - (9 + (i + 0)) - 1];
Chris@0 1755 y[i + 1] = -tmp[36 - (9 + (i + 1)) - 1];
Chris@0 1756 y[i + 2] = -tmp[36 - (9 + (i + 2)) - 1];
Chris@0 1757 }
Chris@0 1758 for (i = 27; i < 36; i += 3) {
Chris@0 1759 y[i + 0] = -tmp[(i + 0) - 27];
Chris@0 1760 y[i + 1] = -tmp[(i + 1) - 27];
Chris@0 1761 y[i + 2] = -tmp[(i + 2) - 27];
Chris@0 1762 }
Chris@0 1763 }
Chris@0 1764 # else
Chris@0 1765 /*
Chris@0 1766 * NAME: imdct36
Chris@0 1767 * DESCRIPTION: perform X[18]->x[36] IMDCT
Chris@0 1768 */
Chris@0 1769 static inline
Chris@0 1770 void imdct36(mad_fixed_t const X[18], mad_fixed_t x[36])
Chris@0 1771 {
Chris@0 1772 mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7;
Chris@0 1773 mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15;
Chris@0 1774 register mad_fixed64hi_t hi;
Chris@0 1775 register mad_fixed64lo_t lo;
Chris@0 1776
Chris@0 1777 MAD_F_ML0(hi, lo, X[4], MAD_F(0x0ec835e8));
Chris@0 1778 MAD_F_MLA(hi, lo, X[13], MAD_F(0x061f78aa));
Chris@0 1779
Chris@0 1780 t6 = MAD_F_MLZ(hi, lo);
Chris@0 1781
Chris@0 1782 MAD_F_MLA(hi, lo, (t14 = X[1] - X[10]), -MAD_F(0x061f78aa));
Chris@0 1783 MAD_F_MLA(hi, lo, (t15 = X[7] + X[16]), -MAD_F(0x0ec835e8));
Chris@0 1784
Chris@0 1785 t0 = MAD_F_MLZ(hi, lo);
Chris@0 1786
Chris@0 1787 MAD_F_MLA(hi, lo, (t8 = X[0] - X[11] - X[12]), MAD_F(0x0216a2a2));
Chris@0 1788 MAD_F_MLA(hi, lo, (t9 = X[2] - X[9] - X[14]), MAD_F(0x09bd7ca0));
Chris@0 1789 MAD_F_MLA(hi, lo, (t10 = X[3] - X[8] - X[15]), -MAD_F(0x0cb19346));
Chris@0 1790 MAD_F_MLA(hi, lo, (t11 = X[5] - X[6] - X[17]), -MAD_F(0x0fdcf549));
Chris@0 1791
Chris@0 1792 x[7] = MAD_F_MLZ(hi, lo);
Chris@0 1793 x[10] = -x[7];
Chris@0 1794
Chris@0 1795 MAD_F_ML0(hi, lo, t8, -MAD_F(0x0cb19346));
Chris@0 1796 MAD_F_MLA(hi, lo, t9, MAD_F(0x0fdcf549));
Chris@0 1797 MAD_F_MLA(hi, lo, t10, MAD_F(0x0216a2a2));
Chris@0 1798 MAD_F_MLA(hi, lo, t11, -MAD_F(0x09bd7ca0));
Chris@0 1799
Chris@0 1800 x[19] = x[34] = MAD_F_MLZ(hi, lo) - t0;
Chris@0 1801
Chris@0 1802 t12 = X[0] - X[3] + X[8] - X[11] - X[12] + X[15];
Chris@0 1803 t13 = X[2] + X[5] - X[6] - X[9] - X[14] - X[17];
Chris@0 1804
Chris@0 1805 MAD_F_ML0(hi, lo, t12, -MAD_F(0x0ec835e8));
Chris@0 1806 MAD_F_MLA(hi, lo, t13, MAD_F(0x061f78aa));
Chris@0 1807
Chris@0 1808 x[22] = x[31] = MAD_F_MLZ(hi, lo) + t0;
Chris@0 1809
Chris@0 1810 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x09bd7ca0));
Chris@0 1811 MAD_F_MLA(hi, lo, X[7], MAD_F(0x0216a2a2));
Chris@0 1812 MAD_F_MLA(hi, lo, X[10], -MAD_F(0x0fdcf549));
Chris@0 1813 MAD_F_MLA(hi, lo, X[16], MAD_F(0x0cb19346));
Chris@0 1814
Chris@0 1815 t1 = MAD_F_MLZ(hi, lo) + t6;
Chris@0 1816
Chris@0 1817 MAD_F_ML0(hi, lo, X[0], MAD_F(0x03768962));
Chris@0 1818 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0e313245));
Chris@0 1819 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0ffc19fd));
Chris@0 1820 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0acf37ad));
Chris@0 1821 MAD_F_MLA(hi, lo, X[6], MAD_F(0x04cfb0e2));
Chris@0 1822 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0898c779));
Chris@0 1823 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0d7e8807));
Chris@0 1824 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f426cb5));
Chris@0 1825 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0bcbe352));
Chris@0 1826 MAD_F_MLA(hi, lo, X[14], MAD_F(0x00b2aa3e));
Chris@0 1827 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x07635284));
Chris@0 1828 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0f9ee890));
Chris@0 1829
Chris@0 1830 x[6] = MAD_F_MLZ(hi, lo) + t1;
Chris@0 1831 x[11] = -x[6];
Chris@0 1832
Chris@0 1833 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f426cb5));
Chris@0 1834 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x00b2aa3e));
Chris@0 1835 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0898c779));
Chris@0 1836 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0f9ee890));
Chris@0 1837 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0acf37ad));
Chris@0 1838 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x07635284));
Chris@0 1839 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0e313245));
Chris@0 1840 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0bcbe352));
Chris@0 1841 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x03768962));
Chris@0 1842 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0d7e8807));
Chris@0 1843 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0ffc19fd));
Chris@0 1844 MAD_F_MLA(hi, lo, X[17], MAD_F(0x04cfb0e2));
Chris@0 1845
Chris@0 1846 x[23] = x[30] = MAD_F_MLZ(hi, lo) + t1;
Chris@0 1847
Chris@0 1848 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0bcbe352));
Chris@0 1849 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0d7e8807));
Chris@0 1850 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x07635284));
Chris@0 1851 MAD_F_MLA(hi, lo, X[5], MAD_F(0x04cfb0e2));
Chris@0 1852 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f9ee890));
Chris@0 1853 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0ffc19fd));
Chris@0 1854 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x00b2aa3e));
Chris@0 1855 MAD_F_MLA(hi, lo, X[11], MAD_F(0x03768962));
Chris@0 1856 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0f426cb5));
Chris@0 1857 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0e313245));
Chris@0 1858 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0898c779));
Chris@0 1859 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0acf37ad));
Chris@0 1860
Chris@0 1861 x[18] = x[35] = MAD_F_MLZ(hi, lo) - t1;
Chris@0 1862
Chris@0 1863 MAD_F_ML0(hi, lo, X[4], MAD_F(0x061f78aa));
Chris@0 1864 MAD_F_MLA(hi, lo, X[13], -MAD_F(0x0ec835e8));
Chris@0 1865
Chris@0 1866 t7 = MAD_F_MLZ(hi, lo);
Chris@0 1867
Chris@0 1868 MAD_F_MLA(hi, lo, X[1], -MAD_F(0x0cb19346));
Chris@0 1869 MAD_F_MLA(hi, lo, X[7], MAD_F(0x0fdcf549));
Chris@0 1870 MAD_F_MLA(hi, lo, X[10], MAD_F(0x0216a2a2));
Chris@0 1871 MAD_F_MLA(hi, lo, X[16], -MAD_F(0x09bd7ca0));
Chris@0 1872
Chris@0 1873 t2 = MAD_F_MLZ(hi, lo);
Chris@0 1874
Chris@0 1875 MAD_F_MLA(hi, lo, X[0], MAD_F(0x04cfb0e2));
Chris@0 1876 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0ffc19fd));
Chris@0 1877 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0d7e8807));
Chris@0 1878 MAD_F_MLA(hi, lo, X[5], MAD_F(0x03768962));
Chris@0 1879 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0bcbe352));
Chris@0 1880 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0e313245));
Chris@0 1881 MAD_F_MLA(hi, lo, X[9], MAD_F(0x07635284));
Chris@0 1882 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0acf37ad));
Chris@0 1883 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0f9ee890));
Chris@0 1884 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0898c779));
Chris@0 1885 MAD_F_MLA(hi, lo, X[15], MAD_F(0x00b2aa3e));
Chris@0 1886 MAD_F_MLA(hi, lo, X[17], MAD_F(0x0f426cb5));
Chris@0 1887
Chris@0 1888 x[5] = MAD_F_MLZ(hi, lo);
Chris@0 1889 x[12] = -x[5];
Chris@0 1890
Chris@0 1891 MAD_F_ML0(hi, lo, X[0], MAD_F(0x0acf37ad));
Chris@0 1892 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0898c779));
Chris@0 1893 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0e313245));
Chris@0 1894 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0f426cb5));
Chris@0 1895 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x03768962));
Chris@0 1896 MAD_F_MLA(hi, lo, X[8], MAD_F(0x00b2aa3e));
Chris@0 1897 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0ffc19fd));
Chris@0 1898 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0f9ee890));
Chris@0 1899 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x04cfb0e2));
Chris@0 1900 MAD_F_MLA(hi, lo, X[14], MAD_F(0x07635284));
Chris@0 1901 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0d7e8807));
Chris@0 1902 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0bcbe352));
Chris@0 1903
Chris@0 1904 x[0] = MAD_F_MLZ(hi, lo) + t2;
Chris@0 1905 x[17] = -x[0];
Chris@0 1906
Chris@0 1907 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0f9ee890));
Chris@0 1908 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x07635284));
Chris@0 1909 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x00b2aa3e));
Chris@0 1910 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0bcbe352));
Chris@0 1911 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0f426cb5));
Chris@0 1912 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0d7e8807));
Chris@0 1913 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0898c779));
Chris@0 1914 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x04cfb0e2));
Chris@0 1915 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0acf37ad));
Chris@0 1916 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0ffc19fd));
Chris@0 1917 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0e313245));
Chris@0 1918 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x03768962));
Chris@0 1919
Chris@0 1920 x[24] = x[29] = MAD_F_MLZ(hi, lo) + t2;
Chris@0 1921
Chris@0 1922 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0216a2a2));
Chris@0 1923 MAD_F_MLA(hi, lo, X[7], -MAD_F(0x09bd7ca0));
Chris@0 1924 MAD_F_MLA(hi, lo, X[10], MAD_F(0x0cb19346));
Chris@0 1925 MAD_F_MLA(hi, lo, X[16], MAD_F(0x0fdcf549));
Chris@0 1926
Chris@0 1927 t3 = MAD_F_MLZ(hi, lo) + t7;
Chris@0 1928
Chris@0 1929 MAD_F_ML0(hi, lo, X[0], MAD_F(0x00b2aa3e));
Chris@0 1930 MAD_F_MLA(hi, lo, X[2], MAD_F(0x03768962));
Chris@0 1931 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x04cfb0e2));
Chris@0 1932 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x07635284));
Chris@0 1933 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0898c779));
Chris@0 1934 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0acf37ad));
Chris@0 1935 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0bcbe352));
Chris@0 1936 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0d7e8807));
Chris@0 1937 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0e313245));
Chris@0 1938 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f426cb5));
Chris@0 1939 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0f9ee890));
Chris@0 1940 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0ffc19fd));
Chris@0 1941
Chris@0 1942 x[8] = MAD_F_MLZ(hi, lo) + t3;
Chris@0 1943 x[9] = -x[8];
Chris@0 1944
Chris@0 1945 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0e313245));
Chris@0 1946 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0bcbe352));
Chris@0 1947 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0f9ee890));
Chris@0 1948 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0898c779));
Chris@0 1949 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0ffc19fd));
Chris@0 1950 MAD_F_MLA(hi, lo, X[8], MAD_F(0x04cfb0e2));
Chris@0 1951 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f426cb5));
Chris@0 1952 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x00b2aa3e));
Chris@0 1953 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0d7e8807));
Chris@0 1954 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x03768962));
Chris@0 1955 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0acf37ad));
Chris@0 1956 MAD_F_MLA(hi, lo, X[17], MAD_F(0x07635284));
Chris@0 1957
Chris@0 1958 x[21] = x[32] = MAD_F_MLZ(hi, lo) + t3;
Chris@0 1959
Chris@0 1960 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0d7e8807));
Chris@0 1961 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0f426cb5));
Chris@0 1962 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0acf37ad));
Chris@0 1963 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0ffc19fd));
Chris@0 1964 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x07635284));
Chris@0 1965 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f9ee890));
Chris@0 1966 MAD_F_MLA(hi, lo, X[9], MAD_F(0x03768962));
Chris@0 1967 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0e313245));
Chris@0 1968 MAD_F_MLA(hi, lo, X[12], MAD_F(0x00b2aa3e));
Chris@0 1969 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0bcbe352));
Chris@0 1970 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x04cfb0e2));
Chris@0 1971 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0898c779));
Chris@0 1972
Chris@0 1973 x[20] = x[33] = MAD_F_MLZ(hi, lo) - t3;
Chris@0 1974
Chris@0 1975 MAD_F_ML0(hi, lo, t14, -MAD_F(0x0ec835e8));
Chris@0 1976 MAD_F_MLA(hi, lo, t15, MAD_F(0x061f78aa));
Chris@0 1977
Chris@0 1978 t4 = MAD_F_MLZ(hi, lo) - t7;
Chris@0 1979
Chris@0 1980 MAD_F_ML0(hi, lo, t12, MAD_F(0x061f78aa));
Chris@0 1981 MAD_F_MLA(hi, lo, t13, MAD_F(0x0ec835e8));
Chris@0 1982
Chris@0 1983 x[4] = MAD_F_MLZ(hi, lo) + t4;
Chris@0 1984 x[13] = -x[4];
Chris@0 1985
Chris@0 1986 MAD_F_ML0(hi, lo, t8, MAD_F(0x09bd7ca0));
Chris@0 1987 MAD_F_MLA(hi, lo, t9, -MAD_F(0x0216a2a2));
Chris@0 1988 MAD_F_MLA(hi, lo, t10, MAD_F(0x0fdcf549));
Chris@0 1989 MAD_F_MLA(hi, lo, t11, -MAD_F(0x0cb19346));
Chris@0 1990
Chris@0 1991 x[1] = MAD_F_MLZ(hi, lo) + t4;
Chris@0 1992 x[16] = -x[1];
Chris@0 1993
Chris@0 1994 MAD_F_ML0(hi, lo, t8, -MAD_F(0x0fdcf549));
Chris@0 1995 MAD_F_MLA(hi, lo, t9, -MAD_F(0x0cb19346));
Chris@0 1996 MAD_F_MLA(hi, lo, t10, -MAD_F(0x09bd7ca0));
Chris@0 1997 MAD_F_MLA(hi, lo, t11, -MAD_F(0x0216a2a2));
Chris@0 1998
Chris@0 1999 x[25] = x[28] = MAD_F_MLZ(hi, lo) + t4;
Chris@0 2000
Chris@0 2001 MAD_F_ML0(hi, lo, X[1], -MAD_F(0x0fdcf549));
Chris@0 2002 MAD_F_MLA(hi, lo, X[7], -MAD_F(0x0cb19346));
Chris@0 2003 MAD_F_MLA(hi, lo, X[10], -MAD_F(0x09bd7ca0));
Chris@0 2004 MAD_F_MLA(hi, lo, X[16], -MAD_F(0x0216a2a2));
Chris@0 2005
Chris@0 2006 t5 = MAD_F_MLZ(hi, lo) - t6;
Chris@0 2007
Chris@0 2008 MAD_F_ML0(hi, lo, X[0], MAD_F(0x0898c779));
Chris@0 2009 MAD_F_MLA(hi, lo, X[2], MAD_F(0x04cfb0e2));
Chris@0 2010 MAD_F_MLA(hi, lo, X[3], MAD_F(0x0bcbe352));
Chris@0 2011 MAD_F_MLA(hi, lo, X[5], MAD_F(0x00b2aa3e));
Chris@0 2012 MAD_F_MLA(hi, lo, X[6], MAD_F(0x0e313245));
Chris@0 2013 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x03768962));
Chris@0 2014 MAD_F_MLA(hi, lo, X[9], MAD_F(0x0f9ee890));
Chris@0 2015 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x07635284));
Chris@0 2016 MAD_F_MLA(hi, lo, X[12], MAD_F(0x0ffc19fd));
Chris@0 2017 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x0acf37ad));
Chris@0 2018 MAD_F_MLA(hi, lo, X[15], MAD_F(0x0f426cb5));
Chris@0 2019 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x0d7e8807));
Chris@0 2020
Chris@0 2021 x[2] = MAD_F_MLZ(hi, lo) + t5;
Chris@0 2022 x[15] = -x[2];
Chris@0 2023
Chris@0 2024 MAD_F_ML0(hi, lo, X[0], MAD_F(0x07635284));
Chris@0 2025 MAD_F_MLA(hi, lo, X[2], MAD_F(0x0acf37ad));
Chris@0 2026 MAD_F_MLA(hi, lo, X[3], MAD_F(0x03768962));
Chris@0 2027 MAD_F_MLA(hi, lo, X[5], MAD_F(0x0d7e8807));
Chris@0 2028 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x00b2aa3e));
Chris@0 2029 MAD_F_MLA(hi, lo, X[8], MAD_F(0x0f426cb5));
Chris@0 2030 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x04cfb0e2));
Chris@0 2031 MAD_F_MLA(hi, lo, X[11], MAD_F(0x0ffc19fd));
Chris@0 2032 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x0898c779));
Chris@0 2033 MAD_F_MLA(hi, lo, X[14], MAD_F(0x0f9ee890));
Chris@0 2034 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x0bcbe352));
Chris@0 2035 MAD_F_MLA(hi, lo, X[17], MAD_F(0x0e313245));
Chris@0 2036
Chris@0 2037 x[3] = MAD_F_MLZ(hi, lo) + t5;
Chris@0 2038 x[14] = -x[3];
Chris@0 2039
Chris@0 2040 MAD_F_ML0(hi, lo, X[0], -MAD_F(0x0ffc19fd));
Chris@0 2041 MAD_F_MLA(hi, lo, X[2], -MAD_F(0x0f9ee890));
Chris@0 2042 MAD_F_MLA(hi, lo, X[3], -MAD_F(0x0f426cb5));
Chris@0 2043 MAD_F_MLA(hi, lo, X[5], -MAD_F(0x0e313245));
Chris@0 2044 MAD_F_MLA(hi, lo, X[6], -MAD_F(0x0d7e8807));
Chris@0 2045 MAD_F_MLA(hi, lo, X[8], -MAD_F(0x0bcbe352));
Chris@0 2046 MAD_F_MLA(hi, lo, X[9], -MAD_F(0x0acf37ad));
Chris@0 2047 MAD_F_MLA(hi, lo, X[11], -MAD_F(0x0898c779));
Chris@0 2048 MAD_F_MLA(hi, lo, X[12], -MAD_F(0x07635284));
Chris@0 2049 MAD_F_MLA(hi, lo, X[14], -MAD_F(0x04cfb0e2));
Chris@0 2050 MAD_F_MLA(hi, lo, X[15], -MAD_F(0x03768962));
Chris@0 2051 MAD_F_MLA(hi, lo, X[17], -MAD_F(0x00b2aa3e));
Chris@0 2052
Chris@0 2053 x[26] = x[27] = MAD_F_MLZ(hi, lo) + t5;
Chris@0 2054 }
Chris@0 2055 # endif
Chris@0 2056
Chris@0 2057 /*
Chris@0 2058 * NAME: III_imdct_l()
Chris@0 2059 * DESCRIPTION: perform IMDCT and windowing for long blocks
Chris@0 2060 */
Chris@0 2061 static
Chris@0 2062 void III_imdct_l(mad_fixed_t const X[18], mad_fixed_t z[36],
Chris@0 2063 unsigned int block_type)
Chris@0 2064 {
Chris@0 2065 unsigned int i;
Chris@0 2066
Chris@0 2067 /* IMDCT */
Chris@0 2068
Chris@0 2069 imdct36(X, z);
Chris@0 2070
Chris@0 2071 /* windowing */
Chris@0 2072
Chris@0 2073 switch (block_type) {
Chris@0 2074 case 0: /* normal window */
Chris@0 2075 # if defined(ASO_INTERLEAVE1)
Chris@0 2076 {
Chris@0 2077 register mad_fixed_t tmp1, tmp2;
Chris@0 2078
Chris@0 2079 tmp1 = window_l[0];
Chris@0 2080 tmp2 = window_l[1];
Chris@0 2081
Chris@0 2082 for (i = 0; i < 34; i += 2) {
Chris@0 2083 z[i + 0] = mad_f_mul(z[i + 0], tmp1);
Chris@0 2084 tmp1 = window_l[i + 2];
Chris@0 2085 z[i + 1] = mad_f_mul(z[i + 1], tmp2);
Chris@0 2086 tmp2 = window_l[i + 3];
Chris@0 2087 }
Chris@0 2088
Chris@0 2089 z[34] = mad_f_mul(z[34], tmp1);
Chris@0 2090 z[35] = mad_f_mul(z[35], tmp2);
Chris@0 2091 }
Chris@0 2092 # elif defined(ASO_INTERLEAVE2)
Chris@0 2093 {
Chris@0 2094 register mad_fixed_t tmp1, tmp2;
Chris@0 2095
Chris@0 2096 tmp1 = z[0];
Chris@0 2097 tmp2 = window_l[0];
Chris@0 2098
Chris@0 2099 for (i = 0; i < 35; ++i) {
Chris@0 2100 z[i] = mad_f_mul(tmp1, tmp2);
Chris@0 2101 tmp1 = z[i + 1];
Chris@0 2102 tmp2 = window_l[i + 1];
Chris@0 2103 }
Chris@0 2104
Chris@0 2105 z[35] = mad_f_mul(tmp1, tmp2);
Chris@0 2106 }
Chris@0 2107 # elif 1
Chris@0 2108 for (i = 0; i < 36; i += 4) {
Chris@0 2109 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
Chris@0 2110 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
Chris@0 2111 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
Chris@0 2112 z[i + 3] = mad_f_mul(z[i + 3], window_l[i + 3]);
Chris@0 2113 }
Chris@0 2114 # else
Chris@0 2115 for (i = 0; i < 36; ++i) z[i] = mad_f_mul(z[i], window_l[i]);
Chris@0 2116 # endif
Chris@0 2117 break;
Chris@0 2118
Chris@0 2119 case 1: /* start block */
Chris@0 2120 for (i = 0; i < 18; i += 3) {
Chris@0 2121 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
Chris@0 2122 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
Chris@0 2123 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
Chris@0 2124 }
Chris@0 2125 /* (i = 18; i < 24; ++i) z[i] unchanged */
Chris@0 2126 for (i = 24; i < 30; ++i) z[i] = mad_f_mul(z[i], window_s[i - 18]);
Chris@0 2127 for (i = 30; i < 36; ++i) z[i] = 0;
Chris@0 2128 break;
Chris@0 2129
Chris@0 2130 case 3: /* stop block */
Chris@0 2131 for (i = 0; i < 6; ++i) z[i] = 0;
Chris@0 2132 for (i = 6; i < 12; ++i) z[i] = mad_f_mul(z[i], window_s[i - 6]);
Chris@0 2133 /* (i = 12; i < 18; ++i) z[i] unchanged */
Chris@0 2134 for (i = 18; i < 36; i += 3) {
Chris@0 2135 z[i + 0] = mad_f_mul(z[i + 0], window_l[i + 0]);
Chris@0 2136 z[i + 1] = mad_f_mul(z[i + 1], window_l[i + 1]);
Chris@0 2137 z[i + 2] = mad_f_mul(z[i + 2], window_l[i + 2]);
Chris@0 2138 }
Chris@0 2139 break;
Chris@0 2140 }
Chris@0 2141 }
Chris@0 2142 # endif /* ASO_IMDCT */
Chris@0 2143
Chris@0 2144 /*
Chris@0 2145 * NAME: III_imdct_s()
Chris@0 2146 * DESCRIPTION: perform IMDCT and windowing for short blocks
Chris@0 2147 */
Chris@0 2148 static
Chris@0 2149 void III_imdct_s(mad_fixed_t const X[18], mad_fixed_t z[36])
Chris@0 2150 {
Chris@0 2151 mad_fixed_t y[36], *yptr;
Chris@0 2152 mad_fixed_t const *wptr;
Chris@0 2153 int w, i;
Chris@0 2154 register mad_fixed64hi_t hi;
Chris@0 2155 register mad_fixed64lo_t lo;
Chris@0 2156
Chris@0 2157 /* IMDCT */
Chris@0 2158
Chris@0 2159 yptr = &y[0];
Chris@0 2160
Chris@0 2161 for (w = 0; w < 3; ++w) {
Chris@0 2162 register mad_fixed_t const (*s)[6];
Chris@0 2163
Chris@0 2164 s = imdct_s;
Chris@0 2165
Chris@0 2166 for (i = 0; i < 3; ++i) {
Chris@0 2167 MAD_F_ML0(hi, lo, X[0], (*s)[0]);
Chris@0 2168 MAD_F_MLA(hi, lo, X[1], (*s)[1]);
Chris@0 2169 MAD_F_MLA(hi, lo, X[2], (*s)[2]);
Chris@0 2170 MAD_F_MLA(hi, lo, X[3], (*s)[3]);
Chris@0 2171 MAD_F_MLA(hi, lo, X[4], (*s)[4]);
Chris@0 2172 MAD_F_MLA(hi, lo, X[5], (*s)[5]);
Chris@0 2173
Chris@0 2174 yptr[i + 0] = MAD_F_MLZ(hi, lo);
Chris@0 2175 yptr[5 - i] = -yptr[i + 0];
Chris@0 2176
Chris@0 2177 ++s;
Chris@0 2178
Chris@0 2179 MAD_F_ML0(hi, lo, X[0], (*s)[0]);
Chris@0 2180 MAD_F_MLA(hi, lo, X[1], (*s)[1]);
Chris@0 2181 MAD_F_MLA(hi, lo, X[2], (*s)[2]);
Chris@0 2182 MAD_F_MLA(hi, lo, X[3], (*s)[3]);
Chris@0 2183 MAD_F_MLA(hi, lo, X[4], (*s)[4]);
Chris@0 2184 MAD_F_MLA(hi, lo, X[5], (*s)[5]);
Chris@0 2185
Chris@0 2186 yptr[ i + 6] = MAD_F_MLZ(hi, lo);
Chris@0 2187 yptr[11 - i] = yptr[i + 6];
Chris@0 2188
Chris@0 2189 ++s;
Chris@0 2190 }
Chris@0 2191
Chris@0 2192 yptr += 12;
Chris@0 2193 X += 6;
Chris@0 2194 }
Chris@0 2195
Chris@0 2196 /* windowing, overlapping and concatenation */
Chris@0 2197
Chris@0 2198 yptr = &y[0];
Chris@0 2199 wptr = &window_s[0];
Chris@0 2200
Chris@0 2201 for (i = 0; i < 6; ++i) {
Chris@0 2202 z[i + 0] = 0;
Chris@0 2203 z[i + 6] = mad_f_mul(yptr[ 0 + 0], wptr[0]);
Chris@0 2204
Chris@0 2205 MAD_F_ML0(hi, lo, yptr[ 0 + 6], wptr[6]);
Chris@0 2206 MAD_F_MLA(hi, lo, yptr[12 + 0], wptr[0]);
Chris@0 2207
Chris@0 2208 z[i + 12] = MAD_F_MLZ(hi, lo);
Chris@0 2209
Chris@0 2210 MAD_F_ML0(hi, lo, yptr[12 + 6], wptr[6]);
Chris@0 2211 MAD_F_MLA(hi, lo, yptr[24 + 0], wptr[0]);
Chris@0 2212
Chris@0 2213 z[i + 18] = MAD_F_MLZ(hi, lo);
Chris@0 2214
Chris@0 2215 z[i + 24] = mad_f_mul(yptr[24 + 6], wptr[6]);
Chris@0 2216 z[i + 30] = 0;
Chris@0 2217
Chris@0 2218 ++yptr;
Chris@0 2219 ++wptr;
Chris@0 2220 }
Chris@0 2221 }
Chris@0 2222
Chris@0 2223 /*
Chris@0 2224 * NAME: III_overlap()
Chris@0 2225 * DESCRIPTION: perform overlap-add of windowed IMDCT outputs
Chris@0 2226 */
Chris@0 2227 static
Chris@0 2228 void III_overlap(mad_fixed_t const output[36], mad_fixed_t overlap[18],
Chris@0 2229 mad_fixed_t sample[18][32], unsigned int sb)
Chris@0 2230 {
Chris@0 2231 unsigned int i;
Chris@0 2232
Chris@0 2233 # if defined(ASO_INTERLEAVE2)
Chris@0 2234 {
Chris@0 2235 register mad_fixed_t tmp1, tmp2;
Chris@0 2236
Chris@0 2237 tmp1 = overlap[0];
Chris@0 2238 tmp2 = overlap[1];
Chris@0 2239
Chris@0 2240 for (i = 0; i < 16; i += 2) {
Chris@0 2241 sample[i + 0][sb] = output[i + 0 + 0] + tmp1;
Chris@0 2242 overlap[i + 0] = output[i + 0 + 18];
Chris@0 2243 tmp1 = overlap[i + 2];
Chris@0 2244
Chris@0 2245 sample[i + 1][sb] = output[i + 1 + 0] + tmp2;
Chris@0 2246 overlap[i + 1] = output[i + 1 + 18];
Chris@0 2247 tmp2 = overlap[i + 3];
Chris@0 2248 }
Chris@0 2249
Chris@0 2250 sample[16][sb] = output[16 + 0] + tmp1;
Chris@0 2251 overlap[16] = output[16 + 18];
Chris@0 2252 sample[17][sb] = output[17 + 0] + tmp2;
Chris@0 2253 overlap[17] = output[17 + 18];
Chris@0 2254 }
Chris@0 2255 # elif 0
Chris@0 2256 for (i = 0; i < 18; i += 2) {
Chris@0 2257 sample[i + 0][sb] = output[i + 0 + 0] + overlap[i + 0];
Chris@0 2258 overlap[i + 0] = output[i + 0 + 18];
Chris@0 2259
Chris@0 2260 sample[i + 1][sb] = output[i + 1 + 0] + overlap[i + 1];
Chris@0 2261 overlap[i + 1] = output[i + 1 + 18];
Chris@0 2262 }
Chris@0 2263 # else
Chris@0 2264 for (i = 0; i < 18; ++i) {
Chris@0 2265 sample[i][sb] = output[i + 0] + overlap[i];
Chris@0 2266 overlap[i] = output[i + 18];
Chris@0 2267 }
Chris@0 2268 # endif
Chris@0 2269 }
Chris@0 2270
Chris@0 2271 /*
Chris@0 2272 * NAME: III_overlap_z()
Chris@0 2273 * DESCRIPTION: perform "overlap-add" of zero IMDCT outputs
Chris@0 2274 */
Chris@0 2275 static inline
Chris@0 2276 void III_overlap_z(mad_fixed_t overlap[18],
Chris@0 2277 mad_fixed_t sample[18][32], unsigned int sb)
Chris@0 2278 {
Chris@0 2279 unsigned int i;
Chris@0 2280
Chris@0 2281 # if defined(ASO_INTERLEAVE2)
Chris@0 2282 {
Chris@0 2283 register mad_fixed_t tmp1, tmp2;
Chris@0 2284
Chris@0 2285 tmp1 = overlap[0];
Chris@0 2286 tmp2 = overlap[1];
Chris@0 2287
Chris@0 2288 for (i = 0; i < 16; i += 2) {
Chris@0 2289 sample[i + 0][sb] = tmp1;
Chris@0 2290 overlap[i + 0] = 0;
Chris@0 2291 tmp1 = overlap[i + 2];
Chris@0 2292
Chris@0 2293 sample[i + 1][sb] = tmp2;
Chris@0 2294 overlap[i + 1] = 0;
Chris@0 2295 tmp2 = overlap[i + 3];
Chris@0 2296 }
Chris@0 2297
Chris@0 2298 sample[16][sb] = tmp1;
Chris@0 2299 overlap[16] = 0;
Chris@0 2300 sample[17][sb] = tmp2;
Chris@0 2301 overlap[17] = 0;
Chris@0 2302 }
Chris@0 2303 # else
Chris@0 2304 for (i = 0; i < 18; ++i) {
Chris@0 2305 sample[i][sb] = overlap[i];
Chris@0 2306 overlap[i] = 0;
Chris@0 2307 }
Chris@0 2308 # endif
Chris@0 2309 }
Chris@0 2310
Chris@0 2311 /*
Chris@0 2312 * NAME: III_freqinver()
Chris@0 2313 * DESCRIPTION: perform subband frequency inversion for odd sample lines
Chris@0 2314 */
Chris@0 2315 static
Chris@0 2316 void III_freqinver(mad_fixed_t sample[18][32], unsigned int sb)
Chris@0 2317 {
Chris@0 2318 unsigned int i;
Chris@0 2319
Chris@0 2320 # if 1 || defined(ASO_INTERLEAVE1) || defined(ASO_INTERLEAVE2)
Chris@0 2321 {
Chris@0 2322 register mad_fixed_t tmp1, tmp2;
Chris@0 2323
Chris@0 2324 tmp1 = sample[1][sb];
Chris@0 2325 tmp2 = sample[3][sb];
Chris@0 2326
Chris@0 2327 for (i = 1; i < 13; i += 4) {
Chris@0 2328 sample[i + 0][sb] = -tmp1;
Chris@0 2329 tmp1 = sample[i + 4][sb];
Chris@0 2330 sample[i + 2][sb] = -tmp2;
Chris@0 2331 tmp2 = sample[i + 6][sb];
Chris@0 2332 }
Chris@0 2333
Chris@0 2334 sample[13][sb] = -tmp1;
Chris@0 2335 tmp1 = sample[17][sb];
Chris@0 2336 sample[15][sb] = -tmp2;
Chris@0 2337 sample[17][sb] = -tmp1;
Chris@0 2338 }
Chris@0 2339 # else
Chris@0 2340 for (i = 1; i < 18; i += 2)
Chris@0 2341 sample[i][sb] = -sample[i][sb];
Chris@0 2342 # endif
Chris@0 2343 }
Chris@0 2344
Chris@0 2345 /*
Chris@0 2346 * NAME: III_decode()
Chris@0 2347 * DESCRIPTION: decode frame main_data
Chris@0 2348 */
Chris@0 2349 static
Chris@0 2350 enum mad_error III_decode(struct mad_bitptr *ptr, struct mad_frame *frame,
Chris@0 2351 struct sideinfo *si, unsigned int nch)
Chris@0 2352 {
Chris@0 2353 struct mad_header *header = &frame->header;
Chris@0 2354 unsigned int sfreqi, ngr, gr;
Chris@0 2355
Chris@0 2356 {
Chris@0 2357 unsigned int sfreq;
Chris@0 2358
Chris@0 2359 sfreq = header->samplerate;
Chris@0 2360 if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
Chris@0 2361 sfreq *= 2;
Chris@0 2362
Chris@0 2363 /* 48000 => 0, 44100 => 1, 32000 => 2,
Chris@0 2364 24000 => 3, 22050 => 4, 16000 => 5 */
Chris@0 2365 sfreqi = ((sfreq >> 7) & 0x000f) +
Chris@0 2366 ((sfreq >> 15) & 0x0001) - 8;
Chris@0 2367
Chris@0 2368 if (header->flags & MAD_FLAG_MPEG_2_5_EXT)
Chris@0 2369 sfreqi += 3;
Chris@0 2370 }
Chris@0 2371
Chris@0 2372 /* scalefactors, Huffman decoding, requantization */
Chris@0 2373
Chris@0 2374 ngr = (header->flags & MAD_FLAG_LSF_EXT) ? 1 : 2;
Chris@0 2375
Chris@0 2376 for (gr = 0; gr < ngr; ++gr) {
Chris@0 2377 struct granule *granule = &si->gr[gr];
Chris@0 2378 unsigned char const *sfbwidth[2];
Chris@0 2379 mad_fixed_t xr[2][576];
Chris@0 2380 unsigned int ch;
Chris@0 2381 enum mad_error error;
Chris@0 2382
Chris@0 2383 for (ch = 0; ch < nch; ++ch) {
Chris@0 2384 struct channel *channel = &granule->ch[ch];
Chris@0 2385 unsigned int part2_length;
Chris@0 2386
Chris@0 2387 sfbwidth[ch] = sfbwidth_table[sfreqi].l;
Chris@0 2388 if (channel->block_type == 2) {
Chris@0 2389 sfbwidth[ch] = (channel->flags & mixed_block_flag) ?
Chris@0 2390 sfbwidth_table[sfreqi].m : sfbwidth_table[sfreqi].s;
Chris@0 2391 }
Chris@0 2392
Chris@0 2393 if (header->flags & MAD_FLAG_LSF_EXT) {
Chris@0 2394 part2_length = III_scalefactors_lsf(ptr, channel,
Chris@0 2395 ch == 0 ? 0 : &si->gr[1].ch[1],
Chris@0 2396 header->mode_extension);
Chris@0 2397 }
Chris@0 2398 else {
Chris@0 2399 part2_length = III_scalefactors(ptr, channel, &si->gr[0].ch[ch],
Chris@0 2400 gr == 0 ? 0 : si->scfsi[ch]);
Chris@0 2401 }
Chris@0 2402
Chris@0 2403 error = III_huffdecode(ptr, xr[ch], channel, sfbwidth[ch], part2_length);
Chris@0 2404 if (error)
Chris@0 2405 return error;
Chris@0 2406 }
Chris@0 2407
Chris@0 2408 /* joint stereo processing */
Chris@0 2409
Chris@0 2410 if (header->mode == MAD_MODE_JOINT_STEREO && header->mode_extension) {
Chris@0 2411 error = III_stereo(xr, granule, header, sfbwidth[0]);
Chris@0 2412 if (error)
Chris@0 2413 return error;
Chris@0 2414 }
Chris@0 2415
Chris@0 2416 /* reordering, alias reduction, IMDCT, overlap-add, frequency inversion */
Chris@0 2417
Chris@0 2418 for (ch = 0; ch < nch; ++ch) {
Chris@0 2419 struct channel const *channel = &granule->ch[ch];
Chris@0 2420 mad_fixed_t (*sample)[32] = &frame->sbsample[ch][18 * gr];
Chris@0 2421 unsigned int sb, l, i, sblimit;
Chris@0 2422 mad_fixed_t output[36];
Chris@0 2423
Chris@0 2424 if (channel->block_type == 2) {
Chris@0 2425 III_reorder(xr[ch], channel, sfbwidth[ch]);
Chris@0 2426
Chris@0 2427 # if !defined(OPT_STRICT)
Chris@0 2428 /*
Chris@0 2429 * According to ISO/IEC 11172-3, "Alias reduction is not applied for
Chris@0 2430 * granules with block_type == 2 (short block)." However, other
Chris@0 2431 * sources suggest alias reduction should indeed be performed on the
Chris@0 2432 * lower two subbands of mixed blocks. Most other implementations do
Chris@0 2433 * this, so by default we will too.
Chris@0 2434 */
Chris@0 2435 if (channel->flags & mixed_block_flag)
Chris@0 2436 III_aliasreduce(xr[ch], 36);
Chris@0 2437 # endif
Chris@0 2438 }
Chris@0 2439 else
Chris@0 2440 III_aliasreduce(xr[ch], 576);
Chris@0 2441
Chris@0 2442 l = 0;
Chris@0 2443
Chris@0 2444 /* subbands 0-1 */
Chris@0 2445
Chris@0 2446 if (channel->block_type != 2 || (channel->flags & mixed_block_flag)) {
Chris@0 2447 unsigned int block_type;
Chris@0 2448
Chris@0 2449 block_type = channel->block_type;
Chris@0 2450 if (channel->flags & mixed_block_flag)
Chris@0 2451 block_type = 0;
Chris@0 2452
Chris@0 2453 /* long blocks */
Chris@0 2454 for (sb = 0; sb < 2; ++sb, l += 18) {
Chris@0 2455 III_imdct_l(&xr[ch][l], output, block_type);
Chris@0 2456 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
Chris@0 2457 }
Chris@0 2458 }
Chris@0 2459 else {
Chris@0 2460 /* short blocks */
Chris@0 2461 for (sb = 0; sb < 2; ++sb, l += 18) {
Chris@0 2462 III_imdct_s(&xr[ch][l], output);
Chris@0 2463 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
Chris@0 2464 }
Chris@0 2465 }
Chris@0 2466
Chris@0 2467 III_freqinver(sample, 1);
Chris@0 2468
Chris@0 2469 /* (nonzero) subbands 2-31 */
Chris@0 2470
Chris@0 2471 i = 576;
Chris@0 2472 while (i > 36 && xr[ch][i - 1] == 0)
Chris@0 2473 --i;
Chris@0 2474
Chris@0 2475 sblimit = 32 - (576 - i) / 18;
Chris@0 2476
Chris@0 2477 if (channel->block_type != 2) {
Chris@0 2478 /* long blocks */
Chris@0 2479 for (sb = 2; sb < sblimit; ++sb, l += 18) {
Chris@0 2480 III_imdct_l(&xr[ch][l], output, channel->block_type);
Chris@0 2481 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
Chris@0 2482
Chris@0 2483 if (sb & 1)
Chris@0 2484 III_freqinver(sample, sb);
Chris@0 2485 }
Chris@0 2486 }
Chris@0 2487 else {
Chris@0 2488 /* short blocks */
Chris@0 2489 for (sb = 2; sb < sblimit; ++sb, l += 18) {
Chris@0 2490 III_imdct_s(&xr[ch][l], output);
Chris@0 2491 III_overlap(output, (*frame->overlap)[ch][sb], sample, sb);
Chris@0 2492
Chris@0 2493 if (sb & 1)
Chris@0 2494 III_freqinver(sample, sb);
Chris@0 2495 }
Chris@0 2496 }
Chris@0 2497
Chris@0 2498 /* remaining (zero) subbands */
Chris@0 2499
Chris@0 2500 for (sb = sblimit; sb < 32; ++sb) {
Chris@0 2501 III_overlap_z((*frame->overlap)[ch][sb], sample, sb);
Chris@0 2502
Chris@0 2503 if (sb & 1)
Chris@0 2504 III_freqinver(sample, sb);
Chris@0 2505 }
Chris@0 2506 }
Chris@0 2507 }
Chris@0 2508
Chris@0 2509 return MAD_ERROR_NONE;
Chris@0 2510 }
Chris@0 2511
Chris@0 2512 /*
Chris@0 2513 * NAME: layer->III()
Chris@0 2514 * DESCRIPTION: decode a single Layer III frame
Chris@0 2515 */
Chris@0 2516 int mad_layer_III(struct mad_stream *stream, struct mad_frame *frame)
Chris@0 2517 {
Chris@0 2518 struct mad_header *header = &frame->header;
Chris@0 2519 unsigned int nch, priv_bitlen, next_md_begin = 0;
Chris@0 2520 unsigned int si_len, data_bitlen, md_len;
Chris@0 2521 unsigned int frame_space, frame_used, frame_free;
Chris@0 2522 struct mad_bitptr ptr;
Chris@0 2523 struct sideinfo si;
Chris@0 2524 enum mad_error error;
Chris@0 2525 int result = 0;
Chris@0 2526
Chris@0 2527 /* allocate Layer III dynamic structures */
Chris@0 2528
Chris@0 2529 if (stream->main_data == 0) {
Chris@0 2530 stream->main_data = malloc(MAD_BUFFER_MDLEN);
Chris@0 2531 if (stream->main_data == 0) {
Chris@0 2532 stream->error = MAD_ERROR_NOMEM;
Chris@0 2533 return -1;
Chris@0 2534 }
Chris@0 2535 }
Chris@0 2536
Chris@0 2537 if (frame->overlap == 0) {
Chris@0 2538 frame->overlap = calloc(2 * 32 * 18, sizeof(mad_fixed_t));
Chris@0 2539 if (frame->overlap == 0) {
Chris@0 2540 stream->error = MAD_ERROR_NOMEM;
Chris@0 2541 return -1;
Chris@0 2542 }
Chris@0 2543 }
Chris@0 2544
Chris@0 2545 nch = MAD_NCHANNELS(header);
Chris@0 2546 si_len = (header->flags & MAD_FLAG_LSF_EXT) ?
Chris@0 2547 (nch == 1 ? 9 : 17) : (nch == 1 ? 17 : 32);
Chris@0 2548
Chris@0 2549 /* check frame sanity */
Chris@0 2550
Chris@0 2551 if (stream->next_frame - mad_bit_nextbyte(&stream->ptr) <
Chris@0 2552 (signed int) si_len) {
Chris@0 2553 stream->error = MAD_ERROR_BADFRAMELEN;
Chris@0 2554 stream->md_len = 0;
Chris@0 2555 return -1;
Chris@0 2556 }
Chris@0 2557
Chris@0 2558 /* check CRC word */
Chris@0 2559
Chris@0 2560 if (header->flags & MAD_FLAG_PROTECTION) {
Chris@0 2561 header->crc_check =
Chris@0 2562 mad_bit_crc(stream->ptr, si_len * CHAR_BIT, header->crc_check);
Chris@0 2563
Chris@0 2564 if (header->crc_check != header->crc_target &&
Chris@0 2565 !(frame->options & MAD_OPTION_IGNORECRC)) {
Chris@0 2566 stream->error = MAD_ERROR_BADCRC;
Chris@0 2567 result = -1;
Chris@0 2568 }
Chris@0 2569 }
Chris@0 2570
Chris@0 2571 /* decode frame side information */
Chris@0 2572
Chris@0 2573 error = III_sideinfo(&stream->ptr, nch, header->flags & MAD_FLAG_LSF_EXT,
Chris@0 2574 &si, &data_bitlen, &priv_bitlen);
Chris@0 2575 if (error && result == 0) {
Chris@0 2576 stream->error = error;
Chris@0 2577 result = -1;
Chris@0 2578 }
Chris@0 2579
Chris@0 2580 header->flags |= priv_bitlen;
Chris@0 2581 header->private_bits |= si.private_bits;
Chris@0 2582
Chris@0 2583 /* find main_data of next frame */
Chris@0 2584
Chris@0 2585 {
Chris@0 2586 struct mad_bitptr peek;
Chris@0 2587 unsigned long header;
Chris@0 2588
Chris@0 2589 mad_bit_init(&peek, stream->next_frame);
Chris@0 2590
Chris@0 2591 header = mad_bit_read(&peek, 32);
Chris@0 2592 if ((header & 0xffe60000L) /* syncword | layer */ == 0xffe20000L) {
Chris@0 2593 if (!(header & 0x00010000L)) /* protection_bit */
Chris@0 2594 mad_bit_skip(&peek, 16); /* crc_check */
Chris@0 2595
Chris@0 2596 next_md_begin =
Chris@0 2597 mad_bit_read(&peek, (header & 0x00080000L) /* ID */ ? 9 : 8);
Chris@0 2598 }
Chris@0 2599
Chris@0 2600 mad_bit_finish(&peek);
Chris@0 2601 }
Chris@0 2602
Chris@0 2603 /* find main_data of this frame */
Chris@0 2604
Chris@0 2605 frame_space = stream->next_frame - mad_bit_nextbyte(&stream->ptr);
Chris@0 2606
Chris@0 2607 if (next_md_begin > si.main_data_begin + frame_space)
Chris@0 2608 next_md_begin = 0;
Chris@0 2609
Chris@0 2610 md_len = si.main_data_begin + frame_space - next_md_begin;
Chris@0 2611
Chris@0 2612 frame_used = 0;
Chris@0 2613
Chris@0 2614 if (si.main_data_begin == 0) {
Chris@0 2615 ptr = stream->ptr;
Chris@0 2616 stream->md_len = 0;
Chris@0 2617
Chris@0 2618 frame_used = md_len;
Chris@0 2619 }
Chris@0 2620 else {
Chris@0 2621 if (si.main_data_begin > stream->md_len) {
Chris@0 2622 if (result == 0) {
Chris@0 2623 stream->error = MAD_ERROR_BADDATAPTR;
Chris@0 2624 result = -1;
Chris@0 2625 }
Chris@0 2626 }
Chris@0 2627 else {
Chris@0 2628 mad_bit_init(&ptr,
Chris@0 2629 *stream->main_data + stream->md_len - si.main_data_begin);
Chris@0 2630
Chris@0 2631 if (md_len > si.main_data_begin) {
Chris@0 2632 assert(stream->md_len + md_len -
Chris@0 2633 si.main_data_begin <= MAD_BUFFER_MDLEN);
Chris@0 2634
Chris@0 2635 memcpy(*stream->main_data + stream->md_len,
Chris@0 2636 mad_bit_nextbyte(&stream->ptr),
Chris@0 2637 frame_used = md_len - si.main_data_begin);
Chris@0 2638 stream->md_len += frame_used;
Chris@0 2639 }
Chris@0 2640 }
Chris@0 2641 }
Chris@0 2642
Chris@0 2643 frame_free = frame_space - frame_used;
Chris@0 2644
Chris@0 2645 /* decode main_data */
Chris@0 2646
Chris@0 2647 if (result == 0) {
Chris@0 2648 error = III_decode(&ptr, frame, &si, nch);
Chris@0 2649 if (error) {
Chris@0 2650 stream->error = error;
Chris@0 2651 result = -1;
Chris@0 2652 }
Chris@0 2653
Chris@0 2654 /* designate ancillary bits */
Chris@0 2655
Chris@0 2656 stream->anc_ptr = ptr;
Chris@0 2657 stream->anc_bitlen = md_len * CHAR_BIT - data_bitlen;
Chris@0 2658 }
Chris@0 2659
Chris@0 2660 # if 0 && defined(DEBUG)
Chris@0 2661 fprintf(stderr,
Chris@0 2662 "main_data_begin:%u, md_len:%u, frame_free:%u, "
Chris@0 2663 "data_bitlen:%u, anc_bitlen: %u\n",
Chris@0 2664 si.main_data_begin, md_len, frame_free,
Chris@0 2665 data_bitlen, stream->anc_bitlen);
Chris@0 2666 # endif
Chris@0 2667
Chris@0 2668 /* preload main_data buffer with up to 511 bytes for next frame(s) */
Chris@0 2669
Chris@0 2670 if (frame_free >= next_md_begin) {
Chris@0 2671 memcpy(*stream->main_data,
Chris@0 2672 stream->next_frame - next_md_begin, next_md_begin);
Chris@0 2673 stream->md_len = next_md_begin;
Chris@0 2674 }
Chris@0 2675 else {
Chris@0 2676 if (md_len < si.main_data_begin) {
Chris@0 2677 unsigned int extra;
Chris@0 2678
Chris@0 2679 extra = si.main_data_begin - md_len;
Chris@0 2680 if (extra + frame_free > next_md_begin)
Chris@0 2681 extra = next_md_begin - frame_free;
Chris@0 2682
Chris@0 2683 if (extra < stream->md_len) {
Chris@0 2684 memmove(*stream->main_data,
Chris@0 2685 *stream->main_data + stream->md_len - extra, extra);
Chris@0 2686 stream->md_len = extra;
Chris@0 2687 }
Chris@0 2688 }
Chris@0 2689 else
Chris@0 2690 stream->md_len = 0;
Chris@0 2691
Chris@0 2692 memcpy(*stream->main_data + stream->md_len,
Chris@0 2693 stream->next_frame - frame_free, frame_free);
Chris@0 2694 stream->md_len += frame_free;
Chris@0 2695 }
Chris@0 2696
Chris@0 2697 return result;
Chris@0 2698 }