The fields of an audio block do not hold samples. They hold a coarse spectral envelope (the exponents), the settings of a model of hearing, and quantised mantissas whose sizes the decoder must work out for itself by running the same bit allocation the encoder ran, exactly, in integer arithmetic. This page follows clauses 5 and 6 of ETSI TS 102 366. A decoder does these steps for each block:
- Find the sync word and check a CRC (error detection).
- Unpack the bit stream information and the block’s side information.
- Decode the exponents.
- Run the bit allocation, giving a pointer (
bap) for each mantissa. - Unpack, ungroup and dequantise the mantissas, and dither the zero-bit ones.
- Decouple the coupled channels.
- Undo rematrixing in 2/0 mode.
- Apply the dynamic range gain.
- Inverse transform, window and overlap-add.
- Downmix if there are fewer loudspeakers than channels.
Exponents
Each transform coefficient is a mantissa times 2−exponent. Exponents are 0 to 24, the count of leading zeros; smaller coefficients keep exponent 24 and let the mantissa carry the zeros. A set of exponents starts with a 4-bit absolute value (0 to 15) for the first bin, then 7-bit groups of differences, each difference −2 to +2 sent as 0 to 4 (the difference plus 2). Three differences make a group:
group = 25 × M1 + 5 × M2 + M3 (0 to 124; more is an error)
M1 = group / 25, M2 = (group % 25) / 5, M3 = group % 5
exp[n] = exp[n − 1] + (M − 2)
The exponent strategy sets how many bins share each difference: one (D15), two (D25) or four (D45). The groups needed are:
| Exponent set | First bin | End (one past the last) | Groups: D15 / D25 / D45 |
|---|---|---|---|
| Full-bandwidth, not coupled | 0 | 37 + 3 × (chbwcod + 12) | ⌊(end − 1) / 3⌋, ⌊(end + 2) / 6⌋, ⌊(end + 8) / 12⌋ |
| Full-bandwidth, coupled | 0 | 37 + 12 × cplbegf | as above |
| Coupling channel | 37 + 12 × cplbegf | 37 + 12 × (cplendf + 3) | (end − start) / 3, / 6, / 12 |
| LFE | 0 | 7 | always two groups, D15 |
The coupling channel’s 4-bit cplabsexp is doubled to make a 5-bit even
value; it is only the starting point for the differences and is not itself the exponent
of any bin, so the first decoded difference gives the exponent of the first coupled
bin. In D25 and D45 each decoded exponent is copied to the next one or three bins.
Exponents are never carried from one frame to the next, so block 0 always has new
ones; later blocks may reuse them only while the bins they cover stay the same.
Bit allocation
The decoder computes a masking curve from the exponents and from the parameters in the block, and compares it with the signal to find each mantissa’s size. It runs whenever a channel has new exponents or the block has new bit allocation, SNR offset or delta information. Every step is defined in integers and table look-ups, so encoder and decoder agree exactly. It is done for each exponent set separately: the uncoupled part of each full-bandwidth channel, the coupling channel and the LFE.
1. Initialisation
sdecay = slowdec[sdcycod] fdecay = fastdec[fdcycod] sgain = slowgain[sgaincod]
dbknee = dbpbtab[dbpbcod] floor = floortab[floorcod] fgain = fastgain[fgaincod]
snroffset = (((csnroffst − 15) << 4) + fsnroffst) << 2
coupling channel only: fastleak = (cplfleak << 8) + 768, slowleak = (cplsleak << 8) + 768
The parameter tables are on the audio
block page. If csnroffst and every fine offset
(cplfsnroffst, each fsnroffst, lfefsnroffst) are
all zero, every bap is 0 and nothing else is done for the block.
2. Exponents to power spectral density
psd[bin] = 3072 − (exp[bin] << 7) (0 to 3072)
3. Integration into bands
The psd values are combined in each of 50 bands of about a sixth of an octave by log-addition:
logadd(a, b): c = a − b; address = min(|c| >> 1, 255)
return (c ≥ 0 ? a : b) + latab[address]
The bands, which do not depend on the sample rate, and the bins 253 to 255, which belong to none:
| Bands | Width in bins | First bins |
|---|---|---|
| 0 to 27 | 1 | band n starts at bin n |
| 28 to 34 | 3 | 28, 31, 34, 37, 40, 43, 46 |
| 35 to 40 | 6 | 49, 55, 61, 67, 73, 79 |
| 41 to 44 | 12 | 85, 97, 109, 121 |
| 45 to 49 | 24 | 133, 157, 181, 205, 229 (to 252) |
The log-addition table latab (Table 6.14) has 256 entries; by index:
| Index | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 40 | 3F | 3E | 3D | 3C | 3B | 3A | 39 | 38 | 37 |
| 10 | 36 | 35 | 34 | 34 | 33 | 32 | 31 | 30 | 2F | 2F |
| 20 | 2E | 2D | 2C | 2C | 2B | 2A | 29 | 29 | 28 | 27 |
| 30 | 26 | 26 | 25 | 24 | 24 | 23 | 23 | 22 | 21 | 21 |
| 40 | 20 | 20 | 1F | 1E | 1E | 1D | 1D | 1C | 1C | 1B |
| 50 | 1B | 1A | 1A | 19 | 19 | 18 | 18 | 17 | 17 | 16 |
| 60 | 16 | 15 | 15 | 15 | 14 | 14 | 13 | 13 | 13 | 12 |
| 70 | 12 | 12 | 11 | 11 | 11 | 10 | 10 | 10 | 0F | 0F |
| 80 | 0F | 0E | 0E | 0E | 0D | 0D | 0D | 0D | 0C | 0C |
| 90 | 0C | 0C | 0B | 0B | 0B | 0B | 0A | 0A | 0A | 0A |
| 100 | 0A | 09 | 09 | 09 | 09 | 09 | 08 | 08 | 08 | 08 |
| 110 | 08 | 08 | 07 | 07 | 07 | 07 | 07 | 07 | 06 | 06 |
| 120 | 06 | 06 | 06 | 06 | 06 | 06 | 05 | 05 | 05 | 05 |
| 130 | 05 | 05 | 05 | 05 | 04 | 04 | 04 | 04 | 04 | 04 |
| 140 | 04 | 04 | 04 | 04 | 04 | 03 | 03 | 03 | 03 | 03 |
| 150 | 03 | 03 | 03 | 03 | 03 | 03 | 03 | 03 | 03 | 02 |
| 160 to 177 | 02 | |||||||||
| 178 to 209 | 01 | |||||||||
| 210 to 255 | 00 | |||||||||
4. Excitation
For a full-bandwidth or LFE channel (whose bands start at 0), a low-frequency
compensation term lowcomp is tracked over bands 0 to 21, and fast and slow
leaky integrators follow the band powers:
calc_lowcomp(a, b0, b1, bin):
bin < 7: if b0 + 256 == b1: a = 384; else if b0 > b1: a = max(0, a − 64)
bin < 20: if b0 + 256 == b1: a = 320; else if b0 > b1: a = max(0, a − 64)
else: a = max(0, a − 128)
excite[0] = bndpsd[0] − fgain − lowcomp; excite[1] = bndpsd[1] − fgain − lowcomp
bands 2 to 6: fastleak = bndpsd − fgain; slowleak = bndpsd − sgain; excite = fastleak − lowcomp,
stopping early at the first band whose power is not above the next band’s
then up to band 21: fastleak = max(fastleak − fdecay, bndpsd − fgain)
slowleak = max(slowleak − sdecay, bndpsd − sgain)
excite = max(fastleak − lowcomp, slowleak)
from band 22 (or from the coupling channel’s first band, with its leak values):
excite = max(fastleak, slowleak), updated the same way
For the LFE, whose bands end at 7, calc_lowcomp and the early stop are not
done for band 6.
5. Masking curve
if bndpsd[band] < dbknee: excite[band] += (dbknee − bndpsd[band]) >> 2
mask[band] = max(excite[band], hth[fscod][band])
| Band | 48 kHz | 44.1 kHz | 32 kHz | Band | 48 kHz | 44.1 kHz | 32 kHz |
|---|---|---|---|---|---|---|---|
| 0 | 4D0 | 4F0 | 580 | 25 | 340 | 350 | 380 |
| 1 | 4D0 | 4F0 | 580 | 26 | 330 | 340 | 380 |
| 2 | 440 | 460 | 4B0 | 27 | 320 | 340 | 370 |
| 3 | 400 | 410 | 450 | 28 | 310 | 320 | 360 |
| 4 | 3E0 | 3E0 | 420 | 29 | 300 | 310 | 350 |
| 5 | 3C0 | 3D0 | 3F0 | 30 | 2F0 | 300 | 340 |
| 6 | 3B0 | 3C0 | 3E0 | 31 | 2F0 | 2F0 | 330 |
| 7 | 3B0 | 3B0 | 3D0 | 32 | 2F0 | 2F0 | 320 |
| 8 | 3A0 | 3B0 | 3C0 | 33 | 2F0 | 2F0 | 310 |
| 9 | 3A0 | 3A0 | 3B0 | 34 | 300 | 2F0 | 300 |
| 10 | 3A0 | 3A0 | 3B0 | 35 | 310 | 300 | 2F0 |
| 11 | 3A0 | 3A0 | 3B0 | 36 | 340 | 320 | 2F0 |
| 12 | 3A0 | 3A0 | 3A0 | 37 | 390 | 350 | 2F0 |
| 13 | 390 | 3A0 | 3A0 | 38 | 3E0 | 390 | 300 |
| 14 | 390 | 390 | 3A0 | 39 | 420 | 3E0 | 310 |
| 15 | 390 | 390 | 3A0 | 40 | 460 | 420 | 330 |
| 16 | 380 | 390 | 3A0 | 41 | 490 | 450 | 350 |
| 17 | 380 | 380 | 3A0 | 42 | 4A0 | 4A0 | 3C0 |
| 18 | 370 | 380 | 3A0 | 43 | 460 | 490 | 410 |
| 19 | 370 | 380 | 3A0 | 44 | 440 | 460 | 470 |
| 20 | 360 | 370 | 390 | 45 | 440 | 440 | 4A0 |
| 21 | 360 | 370 | 390 | 46 | 520 | 480 | 460 |
| 22 | 350 | 360 | 390 | 47 | 800 | 630 | 440 |
| 23 | 350 | 360 | 390 | 48 | 840 | 840 | 450 |
| 24 | 340 | 350 | 380 | 49 | 840 | 840 | 4E0 |
6. Delta bit allocation
If the channel’s deltbae is 0 (reuse) or 1 (new), its segments raise or
lower the masking curve in steps of 6 dB, which on average costs or saves one bit per
mantissa in the band:
band = 0
for each segment: band += deltoffst
delta = deltba ≥ 4 ? (deltba − 3) << 7 : (deltba − 4) << 7
mask[band … band + deltlen − 1] += delta; band += deltlen
A decoder should start each frame with no segments, so that a stream without delta information is never changed. Segments reaching past band 49 are an error.
7. Bit allocation pointers
for each band: m = max(mask − snroffset − floor, 0) & 0x1FE0; m += floor
for each bin in the band: address = clamp((psd[bin] − m) >> 5, 0, 63)
bap[bin] = baptab[address]
| Address | bap | Address | bap | Address | bap | Address | bap |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 13–14 | 5 | 27–30 | 9 | 43–46 | 13 |
| 1–5 | 1 | 15–18 | 6 | 31–34 | 10 | 47–54 | 14 |
| 6–7 | 2 | 19–22 | 7 | 35–38 | 11 | 55–63 | 15 |
| 8–10 | 3 | 23–26 | 8 | 39–42 | 12 | ||
| 11–12 | 4 |
The encoder adjusts csnroffst (3 dB steps) and the fine offsets (3/16 dB
steps) until the mantissas just fit the frame, so the decoder never has to search.
Mantissas
Each pointer selects a quantiser. Pointers 1 to 5 are symmetric, with an odd number of levels; code k of L levels stands for (2k − (L − 1)) / L. Pointers 6 to 15 are plain two’s complement fractions of 5 to 16 bits, from −1.0 up to just under 1.0.
| bap | Levels | Bits | Values |
|---|---|---|---|
| 0 | 0 | 0 | zero, or dither |
| 1 | 3 | 5 for three | −2/3, 0, 2/3 |
| 2 | 5 | 7 for three | −4/5, −2/5, 0, 2/5, 4/5 |
| 3 | 7 | 3 | −6/7 to 6/7 in steps of 2/7 (code 7 unused) |
| 4 | 11 | 7 for two | −10/11 to 10/11 in steps of 2/11 |
| 5 | 15 | 4 | −14/15 to 14/15 in steps of 2/15 (code 15 unused) |
| 6 to 13 | 32 to 4,096 | bap − 1 (5 to 12) | two’s complement fraction |
| 14 | 16,384 | 14 | two’s complement fraction |
| 15 | 65,536 | 16 | two’s complement fraction |
Groups: three 3-level codes a, b, c travel as one 5-bit value 9a + 3b + c (at most 26); three 5-level codes as one 7-bit value 25a + 5b + c (at most 124); two 11-level codes as one 7-bit value 11a + b (at most 120). A group is read where its first mantissa falls; the next mantissas with the same pointer take the rest of it, even in the next channel of the same block. The last groups of a block are padded with dummy values. Mantissas arrive channel by channel; the coupling channel’s come after the first coupled channel’s, and the LFE’s last.
The coefficient is the mantissa shifted right by its exponent:
mantissa × 2−exp. Where the pointer is 0 and the channel’s
dithflag is 1, the decoder uses a random value instead of zero: uniform
between −0.707 and +0.707 is best, ±0.75 nearly as good and ±0.5 acceptable. Dither is
added after decoupling, so each coupled channel gets its own.
Coupling
Bins 37 to 252 form 18 coupling sub-bands of 12 bins. Coupling runs from sub-band
cplbegf to sub-band cplendf + 2, and
cplbndstrc joins neighbouring sub-bands into bands that share one
coordinate per channel.
| Sub-band | Bins | 48 kHz | 44.1 kHz | Sub-band | Bins | 48 kHz | 44.1 kHz |
|---|---|---|---|---|---|---|---|
| 0 | 37–48 | 3.42–4.55 kHz | 3.14–4.18 kHz | 9 | 145–156 | 13.55–14.67 kHz | 12.45–13.48 kHz |
| 1 | 49–60 | 4.55–5.67 kHz | 4.18–5.21 kHz | 10 | 157–168 | 14.67–15.80 kHz | 13.48–14.51 kHz |
| 2 | 61–72 | 5.67–6.80 kHz | 5.21–6.24 kHz | 11 | 169–180 | 15.80–16.92 kHz | 14.51–15.55 kHz |
| 3 | 73–84 | 6.80–7.92 kHz | 6.24–7.28 kHz | 12 | 181–192 | 16.92–18.05 kHz | 15.55–16.58 kHz |
| 4 | 85–96 | 7.92–9.05 kHz | 7.28–8.31 kHz | 13 | 193–204 | 18.05–19.17 kHz | 16.58–17.61 kHz |
| 5 | 97–108 | 9.05–10.17 kHz | 8.31–9.35 kHz | 14 | 205–216 | 19.17–20.30 kHz | 17.61–18.65 kHz |
| 6 | 109–120 | 10.17–11.30 kHz | 9.35–10.38 kHz | 15 | 217–228 | 20.30–21.42 kHz | 18.65–19.68 kHz |
| 7 | 121–132 | 11.30–12.42 kHz | 10.38–11.41 kHz | 16 | 229–240 | 21.42–22.55 kHz | 19.68–20.71 kHz |
| 8 | 133–144 | 12.42–13.55 kHz | 11.41–12.45 kHz | 17 | 241–252 | 22.55–23.67 kHz | 20.71–21.75 kHz |
At 32 kHz the frequencies are two thirds of those at 48 kHz. A coupling coordinate is a 4-bit exponent and a 4-bit mantissa with an implied leading 1, ranged by the channel’s master coordinate:
cplco = (cplcoexp == 15 ? cplcomant / 16 : (cplcomant + 16) / 32) × 2^−(cplcoexp + 3 × mstrcplco)
chmant[ch][bin] = cplmant[bin] × cplco[ch][sub-band of bin] × 8
The factor 8 undoes the encoder’s division by 8 when it formed the coupling channel. In 2/0 mode a phase flag of 1 negates the right channel’s reconstructed coefficients in that band. Coordinates, like the other coupling information, are kept from block to block until new ones arrive, but all of it must be sent again in a block where coupling starts.
Rematrixing
In 2/0 mode the encoder may code, per band, L′ = (L + R) / 2 and R′ = (L − R) / 2. Where
rematflg is 1 the decoder restores L = L′ + R′ and R = L′ − R′, only up to the
smaller of the two channels’ bandwidths.
| Band | Bins | 48 kHz | 44.1 kHz | Present |
|---|---|---|---|---|
| 0 | 13–24 | 1.17–2.30 kHz | 1.08–2.11 kHz | always |
| 1 | 25–36 | 2.30–3.42 kHz | 2.11–3.14 kHz | always |
| 2 | 37–60, or to the coupling start | 3.42–5.67 kHz | 3.14–5.21 kHz | unless coupling starts at sub-band 0 |
| 3 | 61–252, or to the coupling start | 5.67–23.67 kHz | 5.21–21.75 kHz | unless coupling starts at sub-band 0, 1 or 2 |
Dialogue level and dynamic range
dialnorm says how far normal speech sits below full scale, 1 to 31 dB. The
reproduction system sets its volume from it together with the listener’s setting, so
that speech plays equally loud from every programme; it is not applied to the samples
by the decoder itself.
dynrng, sent as often as once per block, is a gain the decoder applies by
default, to all channels (Ch1 only in dual mono, where dynrng2 is Ch2’s). A
listener may choose to apply none, all or a share of it, and different shares for cuts
and boosts. If block 0 has none, it is 0, meaning unity. The byte
X0X1X2.Y3…Y7 holds a signed 3-bit X
and a 5-bit fraction Y:
gain = 2^(X + 1) × (32 + Y) / 64 (−24.08 to +23.94 dB; 0 is 0 dB)
| X (bits 7–5) | Value | Gain before Y |
|---|---|---|
| 011 | 3 | +24.08 dB |
| 010 | 2 | +18.06 dB |
| 001 | 1 | +12.04 dB |
| 000 | 0 | +6.02 dB |
| 111 | −1 | 0 dB |
| 110 | −2 | −6.02 dB |
| 101 | −3 | −12.04 dB |
| 100 | −4 | −18.06 dB |
Y (bits 4–0) is the fraction 0.1Y3Y4Y5Y6Y7 in binary, from 1/2 to 63/64, a further cut of 6.02 to 0.14 dB. To apply a share of the compression, treat the byte as a signed fraction X0.X1X2Y…, multiply it by the share and read it back the same way.
compr, at most once per frame, is a heavy compression word for products
that must limit their peak level, such as a set-top box feeding an RF modulator. It has
twice the range and half the resolution: a signed 4-bit X and a 4-bit fraction Y, gain
2X + 1 × (16 + Y) / 32, from −48.14 to +47.88 dB (X = 7 is +48.16 dB before
Y, X = −8 is −42.14 dB). Such a product uses compr where a frame has it and
dynrng otherwise.
The inverse transform
Each block is 256 new samples. With blksw 0 the 256 coefficients are one
512-point inverse MDCT; with 1 they are two 256-point transforms whose coefficients
arrive interleaved (even bins the first, odd bins the second), for twice the time
resolution around transients. With N = 512 and the coefficients X[k]:
xcos1[k] = −cos(2π(8k + 1) / 8N), xsin1[k] = −sin(2π(8k + 1) / 8N)
Z[k] = (X[N/2 − 2k − 1] + j·X[2k]) × (xcos1[k] + j·xsin1[k]) k = 0 … N/4 − 1
z[n] = Σ Z[k] × (cos(8πkn/N) + j·sin(8πkn/N)) a 128-point inverse FFT
y[n] = z[n] × (xcos1[n] + j·xsin1[n])
for n = 0 … N/8 − 1:
x[2n] = −yi[N/8 + n] × w[2n] x[2n + 1] = yr[N/8 − n − 1] × w[2n + 1]
x[N/4 + 2n] = −yr[n] × w[N/4 + 2n] x[N/4 + 2n + 1] = yi[N/4 − n − 1] × w[N/4 + 2n + 1]
x[N/2 + 2n] = −yr[N/8 + n] × w[N/2 − 2n − 1] x[N/2 + 2n + 1] = yi[N/8 − n − 1] × w[N/2 − 2n − 2]
x[3N/4 + 2n] = yi[n] × w[N/4 − 2n − 1] x[3N/4 + 2n + 1] = −yr[N/4 − n − 1] × w[N/4 − 2n − 2]
pcm[n] = 2 × (x[n] + delay[n]); delay[n] = x[N/2 + n] n = 0 … 255
The short transforms do the same twice on X1[k] = X[2k] and X2[k] = X[2k + 1] with 64-point FFTs and xcos2[k] = −cos(2π(8k + 1) / 4N), xsin2[k] = −sin(2π(8k + 1) / 4N); the first half-transform fills x[0…255] and the second x[256…511] in the same pattern. The factor 2 undoes headroom the encoder took; the sum should saturate rather than wrap, since coding error can take the output slightly past full scale.
The window w[n], n = 0 to 255, is the first half of a symmetric 512-point window (Table 6.33 prints all 256 values to five places, from w[0] = 0.00014 through w[127] = 0.70269 to w[255] = 1.00000). Its values are those of a Kaiser–Bessel-derived window with α = 5, to every printed place.
gainrng (Table 6.33a) tells how loud the block was before the window: 0 if
its peak was 0.5 or more, 1 from 0.25, 2 from 0.125, 3 below that. A fixed-point decoder
may use it to pre-scale the coefficients and post-scale the output, for more dynamic
range from a short word length; a floating-point decoder can ignore it.
Downmixing
With fewer loudspeakers than channels, the decoder mixes down with the standard equations, so producers can check what every listener will hear. Two stereo forms are defined, Lo/Ro (conventional) and Lt/Rt (matrix-surround compatible), and mono is Lo + Ro:
Lo = L + clev × C + slev × Ls Lt = L + 0.707 × C − 0.707 × Ls − 0.707 × Rs
Ro = R + clev × C + slev × Rs Rt = R + 0.707 × C + 0.707 × Ls + 0.707 × Rs
with one surround S: Lo, Ro += 0.7 × slev × S; Lt −= 0.707 × S, Rt += 0.707 × S
M = L + 2 × clev × C + R + slev × Ls + slev × Rs
clev and slev come from cmixlev and
surmixlev (reserved codes: use −4.5 dB and −6 dB), or, in the Annex D syntax
and Enhanced AC-3, from the Lt/Rt and Lo/Ro mix levels. Missing channels drop out of the
equations. To avoid overload all coefficients are scaled down together, by the worst
case, when clev and slev are both 0.707: 1/2.414 (−7.65 dB) for Lo/Ro, 1/3.121
(−9.89 dB) for Lt/Rt, and a further half for mono. Six-bit coefficients are accurate
enough:
| Downmix | Unscaled | Scaled | 6-bit | Gain |
|---|---|---|---|---|
| Lo/Ro | 1.0 | 0.414 | 26/64 | −7.8 dB |
| 0.707 | 0.293 | 18/64 | −11.0 dB | |
| 0.596 | 0.247 | 15/64 | −12.6 dB | |
| 0.500 | 0.207 | 13/64 | −13.8 dB | |
| 0.354 | 0.147 | 9/64 | −17.0 dB | |
| Lt/Rt | 1.0 | 0.3204 | 20/64 | −10.1 dB |
| 0.707 | 0.2265 | 14/64 | −13.2 dB |
In dual mono a decoder offers Ch1, Ch2, both, or a mono sum: one loudspeaker gets the chosen channel or both at −6 dB; two get Ch1 left and Ch2 right, or the chosen channel on both at −3 dB, or the sum at −6 dB on both. Mixing the LFE into a downmix is optional, ideally at +10 dB; Enhanced AC-3 can give its level (lfemixlevcod). Karaoke streams have their own reproduction rules, on the bit stream information page.
Error detection
The CRCs (polynomial x16 + x15 + x2 + 1, from zero, most significant bit first, the sync word left out) are described on the sync frame page. What to do about an error is left to the decoder: mute, or repeat a block or a frame. Even a frame with good CRCs can be broken; TS 102 366 lists these conditions, any of which means the frame should not be trusted:
- block 0 lacks a coupling strategy (
cplstre0), rematrixing strategy (2/0 mode), exponent strategy for any channel or the LFE, bit allocation parameters (baie), SNR offsets (snroffste) or, with coupling, leak values (cplleake); - coupling with fewer than two channels in it, or with
cplbegfabovecplendf + 2; - a channel newly in coupling (in block 0 or after a block without coupling) that
reuses coordinates, or a coupling channel that then reuses exponents, or reuses them
when
cplbegforcplendfchanged; - reused exponents for a channel whose bandwidth changed;
chbwcodabove 60;- delta bit allocation reaching past band 49;
- a grouped exponent above 124, or grouped mantissas above 26, 124 or 120;
- unpacking that runs past the end of the frame.
The encoder must also keep the syncinfo, bit stream information and blocks 0 and 1 within the first 5/8 of the frame, and block 5’s mantissas, the auxiliary data and the error check within the last 3/8, so that a decoder can start once crc1 has checked.