xref: /third_party/ffmpeg/libavcodec/eac3dec.c (revision cabdff1a)
1/*
2 * E-AC-3 decoder
3 * Copyright (c) 2007 Bartlomiej Wolowiec <bartek.wolowiec@gmail.com>
4 * Copyright (c) 2008 Justin Ruggles
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23/*
24 * There are several features of E-AC-3 that this decoder does not yet support.
25 *
26 * Enhanced Coupling
27 *     No known samples exist.  If any ever surface, this feature should not be
28 *     too difficult to implement.
29 *
30 * Reduced Sample Rates
31 *     No known samples exist.  The spec also does not give clear information
32 *     on how this is to be implemented.
33 *
34 * Transient Pre-noise Processing
35 *     This is side information which a decoder should use to reduce artifacts
36 *     caused by transients.  There are samples which are known to have this
37 *     information, but this decoder currently ignores it.
38 */
39
40
41#include "avcodec.h"
42#include "aac_ac3_parser.h"
43#include "ac3.h"
44#include "ac3dec.h"
45#include "ac3dec_data.h"
46#include "eac3_data.h"
47
48/** gain adaptive quantization mode */
49typedef enum {
50    EAC3_GAQ_NO =0,
51    EAC3_GAQ_12,
52    EAC3_GAQ_14,
53    EAC3_GAQ_124
54} EAC3GaqMode;
55
56#define EAC3_SR_CODE_REDUCED  3
57
58static void ff_eac3_apply_spectral_extension(AC3DecodeContext *s)
59{
60    int bin, bnd, ch, i;
61    uint8_t wrapflag[SPX_MAX_BANDS]={1,0,}, num_copy_sections, copy_sizes[SPX_MAX_BANDS];
62    float rms_energy[SPX_MAX_BANDS];
63
64    /* Set copy index mapping table. Set wrap flags to apply a notch filter at
65       wrap points later on. */
66    bin = s->spx_dst_start_freq;
67    num_copy_sections = 0;
68    for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
69        int copysize;
70        int bandsize = s->spx_band_sizes[bnd];
71        if (bin + bandsize > s->spx_src_start_freq) {
72            copy_sizes[num_copy_sections++] = bin - s->spx_dst_start_freq;
73            bin = s->spx_dst_start_freq;
74            wrapflag[bnd] = 1;
75        }
76        for (i = 0; i < bandsize; i += copysize) {
77            if (bin == s->spx_src_start_freq) {
78                copy_sizes[num_copy_sections++] = bin - s->spx_dst_start_freq;
79                bin = s->spx_dst_start_freq;
80            }
81            copysize = FFMIN(bandsize - i, s->spx_src_start_freq - bin);
82            bin += copysize;
83        }
84    }
85    copy_sizes[num_copy_sections++] = bin - s->spx_dst_start_freq;
86
87    for (ch = 1; ch <= s->fbw_channels; ch++) {
88        if (!s->channel_uses_spx[ch])
89            continue;
90
91        /* Copy coeffs from normal bands to extension bands */
92        bin = s->spx_src_start_freq;
93        for (i = 0; i < num_copy_sections; i++) {
94            memcpy(&s->transform_coeffs[ch][bin],
95                   &s->transform_coeffs[ch][s->spx_dst_start_freq],
96                   copy_sizes[i]*sizeof(INTFLOAT));
97            bin += copy_sizes[i];
98        }
99
100        /* Calculate RMS energy for each SPX band. */
101        bin = s->spx_src_start_freq;
102        for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
103            int bandsize = s->spx_band_sizes[bnd];
104            float accum = 0.0f;
105            for (i = 0; i < bandsize; i++) {
106                float coeff = s->transform_coeffs[ch][bin++];
107                accum += coeff * coeff;
108            }
109            rms_energy[bnd] = sqrtf(accum / bandsize);
110        }
111
112        /* Apply a notch filter at transitions between normal and extension
113           bands and at all wrap points. */
114        if (s->spx_atten_code[ch] >= 0) {
115            const float *atten_tab = ff_eac3_spx_atten_tab[s->spx_atten_code[ch]];
116            bin = s->spx_src_start_freq - 2;
117            for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
118                if (wrapflag[bnd]) {
119                    INTFLOAT *coeffs = &s->transform_coeffs[ch][bin];
120                    coeffs[0] *= atten_tab[0];
121                    coeffs[1] *= atten_tab[1];
122                    coeffs[2] *= atten_tab[2];
123                    coeffs[3] *= atten_tab[1];
124                    coeffs[4] *= atten_tab[0];
125                }
126                bin += s->spx_band_sizes[bnd];
127            }
128        }
129
130        /* Apply noise-blended coefficient scaling based on previously
131           calculated RMS energy, blending factors, and SPX coordinates for
132           each band. */
133        bin = s->spx_src_start_freq;
134        for (bnd = 0; bnd < s->num_spx_bands; bnd++) {
135            float nscale = s->spx_noise_blend[ch][bnd] * rms_energy[bnd] * (1.0f / INT32_MIN);
136            float sscale = s->spx_signal_blend[ch][bnd];
137#if USE_FIXED
138            // spx_noise_blend and spx_signal_blend are both FP.23
139            nscale *= 1.0 / (1<<23);
140            sscale *= 1.0 / (1<<23);
141            if (nscale < -1.0)
142                nscale = -1.0;
143#endif
144            for (i = 0; i < s->spx_band_sizes[bnd]; i++) {
145                UINTFLOAT noise = (INTFLOAT)(nscale * (int32_t)av_lfg_get(&s->dith_state));
146                s->transform_coeffs[ch][bin]   *= sscale;
147                s->transform_coeffs[ch][bin++] += noise;
148            }
149        }
150    }
151}
152
153
154/** lrint(M_SQRT2*cos(2*M_PI/12)*(1<<23)) */
155#define COEFF_0 10273905LL
156
157/** lrint(M_SQRT2*cos(0*M_PI/12)*(1<<23)) = lrint(M_SQRT2*(1<<23)) */
158#define COEFF_1 11863283LL
159
160/** lrint(M_SQRT2*cos(5*M_PI/12)*(1<<23)) */
161#define COEFF_2  3070444LL
162
163/**
164 * Calculate 6-point IDCT of the pre-mantissas.
165 * All calculations are 24-bit fixed-point.
166 */
167static void idct6(int pre_mant[6])
168{
169    int tmp;
170    int even0, even1, even2, odd0, odd1, odd2;
171
172    odd1 = pre_mant[1] - pre_mant[3] - pre_mant[5];
173
174    even2 = ( pre_mant[2]                * COEFF_0) >> 23;
175    tmp   = ( pre_mant[4]                * COEFF_1) >> 23;
176    odd0  = ((pre_mant[1] + pre_mant[5]) * COEFF_2) >> 23;
177
178    even0 = pre_mant[0] + (tmp >> 1);
179    even1 = pre_mant[0] - tmp;
180
181    tmp = even0;
182    even0 = tmp + even2;
183    even2 = tmp - even2;
184
185    tmp = odd0;
186    odd0 = tmp + pre_mant[1] + pre_mant[3];
187    odd2 = tmp + pre_mant[5] - pre_mant[3];
188
189    pre_mant[0] = even0 + odd0;
190    pre_mant[1] = even1 + odd1;
191    pre_mant[2] = even2 + odd2;
192    pre_mant[3] = even2 - odd2;
193    pre_mant[4] = even1 - odd1;
194    pre_mant[5] = even0 - odd0;
195}
196
197static void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch)
198{
199    int bin, blk, gs;
200    int end_bap, gaq_mode;
201    GetBitContext *gbc = &s->gbc;
202    int gaq_gain[AC3_MAX_COEFS];
203
204    gaq_mode = get_bits(gbc, 2);
205    end_bap = (gaq_mode < 2) ? 12 : 17;
206
207    /* if GAQ gain is used, decode gain codes for bins with hebap between
208       8 and end_bap */
209    gs = 0;
210    if (gaq_mode == EAC3_GAQ_12 || gaq_mode == EAC3_GAQ_14) {
211        /* read 1-bit GAQ gain codes */
212        for (bin = s->start_freq[ch]; bin < s->end_freq[ch]; bin++) {
213            if (s->bap[ch][bin] > 7 && s->bap[ch][bin] < end_bap)
214                gaq_gain[gs++] = get_bits1(gbc) << (gaq_mode-1);
215        }
216    } else if (gaq_mode == EAC3_GAQ_124) {
217        /* read 1.67-bit GAQ gain codes (3 codes in 5 bits) */
218        int gc = 2;
219        for (bin = s->start_freq[ch]; bin < s->end_freq[ch]; bin++) {
220            if (s->bap[ch][bin] > 7 && s->bap[ch][bin] < 17) {
221                if (gc++ == 2) {
222                    int group_code = get_bits(gbc, 5);
223                    if (group_code > 26) {
224                        av_log(s->avctx, AV_LOG_WARNING, "GAQ gain group code out-of-range\n");
225                        group_code = 26;
226                    }
227                    gaq_gain[gs++] = ff_ac3_ungroup_3_in_5_bits_tab[group_code][0];
228                    gaq_gain[gs++] = ff_ac3_ungroup_3_in_5_bits_tab[group_code][1];
229                    gaq_gain[gs++] = ff_ac3_ungroup_3_in_5_bits_tab[group_code][2];
230                    gc = 0;
231                }
232            }
233        }
234    }
235
236    gs=0;
237    for (bin = s->start_freq[ch]; bin < s->end_freq[ch]; bin++) {
238        int hebap = s->bap[ch][bin];
239        int bits = ff_eac3_bits_vs_hebap[hebap];
240        if (!hebap) {
241            /* zero-mantissa dithering */
242            for (blk = 0; blk < 6; blk++) {
243                s->pre_mantissa[ch][bin][blk] = (av_lfg_get(&s->dith_state) & 0x7FFFFF) - 0x400000;
244            }
245        } else if (hebap < 8) {
246            /* Vector Quantization */
247            int v = get_bits(gbc, bits);
248            for (blk = 0; blk < 6; blk++) {
249                s->pre_mantissa[ch][bin][blk] = ff_eac3_mantissa_vq[hebap][v][blk] * (1 << 8);
250            }
251        } else {
252            /* Gain Adaptive Quantization */
253            int gbits, log_gain;
254            if (gaq_mode != EAC3_GAQ_NO && hebap < end_bap) {
255                log_gain = gaq_gain[gs++];
256            } else {
257                log_gain = 0;
258            }
259            gbits = bits - log_gain;
260
261            for (blk = 0; blk < 6; blk++) {
262                int mant = get_sbits(gbc, gbits);
263                if (log_gain && mant == -(1 << (gbits-1))) {
264                    /* large mantissa */
265                    int b;
266                    int mbits = bits - (2 - log_gain);
267                    mant = get_sbits(gbc, mbits);
268                    mant = ((unsigned)mant) << (23 - (mbits - 1));
269                    /* remap mantissa value to correct for asymmetric quantization */
270                    if (mant >= 0)
271                        b = 1 << (23 - log_gain);
272                    else
273                        b = ff_eac3_gaq_remap_2_4_b[hebap-8][log_gain-1] * (1 << 8);
274                    mant += ((ff_eac3_gaq_remap_2_4_a[hebap-8][log_gain-1] * (int64_t)mant) >> 15) + b;
275                } else {
276                    /* small mantissa, no GAQ, or Gk=1 */
277                    mant *= (1 << 24 - bits);
278                    if (!log_gain) {
279                        /* remap mantissa value for no GAQ or Gk=1 */
280                        mant += (ff_eac3_gaq_remap_1[hebap-8] * (int64_t)mant) >> 15;
281                    }
282                }
283                s->pre_mantissa[ch][bin][blk] = mant;
284            }
285        }
286        idct6(s->pre_mantissa[ch][bin]);
287    }
288}
289
290static int ff_eac3_parse_header(AC3DecodeContext *s)
291{
292    int i, blk, ch;
293    int ac3_exponent_strategy, parse_aht_info, parse_spx_atten_data;
294    int parse_transient_proc_info;
295    int num_cpl_blocks;
296    GetBitContext *gbc = &s->gbc;
297
298    /* An E-AC-3 stream can have multiple independent streams which the
299       application can select from. each independent stream can also contain
300       dependent streams which are used to add or replace channels. */
301    if (s->frame_type == EAC3_FRAME_TYPE_RESERVED) {
302        av_log(s->avctx, AV_LOG_ERROR, "Reserved frame type\n");
303        return AAC_AC3_PARSE_ERROR_FRAME_TYPE;
304    }
305
306    /* The substream id indicates which substream this frame belongs to. each
307       independent stream has its own substream id, and the dependent streams
308       associated to an independent stream have matching substream id's. */
309    if (s->substreamid) {
310        /* only decode substream with id=0. skip any additional substreams. */
311        if (!s->eac3_subsbtreamid_found) {
312            s->eac3_subsbtreamid_found = 1;
313            avpriv_request_sample(s->avctx, "Additional substreams");
314        }
315        return AAC_AC3_PARSE_ERROR_FRAME_TYPE;
316    }
317
318    if (s->bit_alloc_params.sr_code == EAC3_SR_CODE_REDUCED) {
319        /* The E-AC-3 specification does not tell how to handle reduced sample
320           rates in bit allocation.  The best assumption would be that it is
321           handled like AC-3 DolbyNet, but we cannot be sure until we have a
322           sample which utilizes this feature. */
323        avpriv_request_sample(s->avctx, "Reduced sampling rate");
324        return AVERROR_PATCHWELCOME;
325    }
326    skip_bits(gbc, 5); // skip bitstream id
327
328    /* volume control params */
329    for (i = 0; i < (s->channel_mode ? 1 : 2); i++) {
330        s->dialog_normalization[i] = -get_bits(gbc, 5);
331        if (s->dialog_normalization[i] == 0) {
332            s->dialog_normalization[i] = -31;
333        }
334        if (s->target_level != 0) {
335            s->level_gain[i] = powf(2.0f,
336                (float)(s->target_level - s->dialog_normalization[i])/6.0f);
337        }
338        s->compression_exists[i] = get_bits1(gbc);
339        if (s->compression_exists[i]) {
340            s->heavy_dynamic_range[i] = AC3_HEAVY_RANGE(get_bits(gbc, 8));
341        }
342    }
343
344    /* dependent stream channel map */
345    if (s->frame_type == EAC3_FRAME_TYPE_DEPENDENT) {
346        if (get_bits1(gbc)) {
347            int64_t channel_layout = 0;
348            int channel_map = get_bits(gbc, 16);
349            av_log(s->avctx, AV_LOG_DEBUG, "channel_map: %0X\n", channel_map);
350
351            for (i = 0; i < 16; i++)
352                if (channel_map & (1 << (EAC3_MAX_CHANNELS - i - 1)))
353                    channel_layout |= ff_eac3_custom_channel_map_locations[i][1];
354
355            if (av_popcount64(channel_layout) > EAC3_MAX_CHANNELS) {
356                return AVERROR_INVALIDDATA;
357            }
358            s->channel_map = channel_map;
359        }
360    }
361
362    /* mixing metadata */
363    if (get_bits1(gbc)) {
364        /* center and surround mix levels */
365        if (s->channel_mode > AC3_CHMODE_STEREO) {
366            s->preferred_downmix = get_bits(gbc, 2);
367            if (s->channel_mode & 1) {
368                /* if three front channels exist */
369                s->center_mix_level_ltrt = get_bits(gbc, 3);
370                s->center_mix_level      = get_bits(gbc, 3);
371            }
372            if (s->channel_mode & 4) {
373                /* if a surround channel exists */
374                s->surround_mix_level_ltrt = av_clip(get_bits(gbc, 3), 3, 7);
375                s->surround_mix_level      = av_clip(get_bits(gbc, 3), 3, 7);
376            }
377        }
378
379        /* lfe mix level */
380        if (s->lfe_on && (s->lfe_mix_level_exists = get_bits1(gbc))) {
381            s->lfe_mix_level = get_bits(gbc, 5);
382        }
383
384        /* info for mixing with other streams and substreams */
385        if (s->frame_type == EAC3_FRAME_TYPE_INDEPENDENT) {
386            for (i = 0; i < (s->channel_mode ? 1 : 2); i++) {
387                // TODO: apply program scale factor
388                if (get_bits1(gbc)) {
389                    skip_bits(gbc, 6);  // skip program scale factor
390                }
391            }
392            if (get_bits1(gbc)) {
393                skip_bits(gbc, 6);  // skip external program scale factor
394            }
395            /* skip mixing parameter data */
396            switch(get_bits(gbc, 2)) {
397                case 1: skip_bits(gbc, 5);  break;
398                case 2: skip_bits(gbc, 12); break;
399                case 3: {
400                    int mix_data_size = (get_bits(gbc, 5) + 2) << 3;
401                    skip_bits_long(gbc, mix_data_size);
402                    break;
403                }
404            }
405            /* skip pan information for mono or dual mono source */
406            if (s->channel_mode < AC3_CHMODE_STEREO) {
407                for (i = 0; i < (s->channel_mode ? 1 : 2); i++) {
408                    if (get_bits1(gbc)) {
409                        /* note: this is not in the ATSC A/52B specification
410                           reference: ETSI TS 102 366 V1.1.1
411                                      section: E.1.3.1.25 */
412                        skip_bits(gbc, 8);  // skip pan mean direction index
413                        skip_bits(gbc, 6);  // skip reserved paninfo bits
414                    }
415                }
416            }
417            /* skip mixing configuration information */
418            if (get_bits1(gbc)) {
419                for (blk = 0; blk < s->num_blocks; blk++) {
420                    if (s->num_blocks == 1 || get_bits1(gbc)) {
421                        skip_bits(gbc, 5);
422                    }
423                }
424            }
425        }
426    }
427
428    /* informational metadata */
429    if (get_bits1(gbc)) {
430        s->bitstream_mode = get_bits(gbc, 3);
431        skip_bits(gbc, 2); // skip copyright bit and original bitstream bit
432        if (s->channel_mode == AC3_CHMODE_STEREO) {
433            s->dolby_surround_mode  = get_bits(gbc, 2);
434            s->dolby_headphone_mode = get_bits(gbc, 2);
435        }
436        if (s->channel_mode >= AC3_CHMODE_2F2R) {
437            s->dolby_surround_ex_mode = get_bits(gbc, 2);
438        }
439        for (i = 0; i < (s->channel_mode ? 1 : 2); i++) {
440            if (get_bits1(gbc)) {
441                skip_bits(gbc, 8); // skip mix level, room type, and A/D converter type
442            }
443        }
444        if (s->bit_alloc_params.sr_code != EAC3_SR_CODE_REDUCED) {
445            skip_bits1(gbc); // skip source sample rate code
446        }
447    }
448
449    /* converter synchronization flag
450       If frames are less than six blocks, this bit should be turned on
451       once every 6 blocks to indicate the start of a frame set.
452       reference: RFC 4598, Section 2.1.3  Frame Sets */
453    if (s->frame_type == EAC3_FRAME_TYPE_INDEPENDENT && s->num_blocks != 6) {
454        skip_bits1(gbc); // skip converter synchronization flag
455    }
456
457    /* original frame size code if this stream was converted from AC-3 */
458    if (s->frame_type == EAC3_FRAME_TYPE_AC3_CONVERT &&
459            (s->num_blocks == 6 || get_bits1(gbc))) {
460        skip_bits(gbc, 6); // skip frame size code
461    }
462
463    /* additional bitstream info */
464    if (get_bits1(gbc)) {
465        int addbsil = get_bits(gbc, 6);
466        for (i = 0; i < addbsil + 1; i++) {
467            skip_bits(gbc, 8); // skip additional bit stream info
468        }
469    }
470
471    /* audio frame syntax flags, strategy data, and per-frame data */
472
473    if (s->num_blocks == 6) {
474        ac3_exponent_strategy = get_bits1(gbc);
475        parse_aht_info        = get_bits1(gbc);
476    } else {
477        /* less than 6 blocks, so use AC-3-style exponent strategy syntax, and
478           do not use AHT */
479        ac3_exponent_strategy = 1;
480        parse_aht_info = 0;
481    }
482
483    s->snr_offset_strategy    = get_bits(gbc, 2);
484    parse_transient_proc_info = get_bits1(gbc);
485
486    s->block_switch_syntax = get_bits1(gbc);
487    if (!s->block_switch_syntax)
488        memset(s->block_switch, 0, sizeof(s->block_switch));
489
490    s->dither_flag_syntax = get_bits1(gbc);
491    if (!s->dither_flag_syntax) {
492        for (ch = 1; ch <= s->fbw_channels; ch++)
493            s->dither_flag[ch] = 1;
494    }
495    s->dither_flag[CPL_CH] = s->dither_flag[s->lfe_ch] = 0;
496
497    s->bit_allocation_syntax = get_bits1(gbc);
498    if (!s->bit_allocation_syntax) {
499        /* set default bit allocation parameters */
500        s->bit_alloc_params.slow_decay = ff_ac3_slow_decay_tab[2];
501        s->bit_alloc_params.fast_decay = ff_ac3_fast_decay_tab[1];
502        s->bit_alloc_params.slow_gain  = ff_ac3_slow_gain_tab [1];
503        s->bit_alloc_params.db_per_bit = ff_ac3_db_per_bit_tab[2];
504        s->bit_alloc_params.floor      = ff_ac3_floor_tab     [7];
505    }
506
507    s->fast_gain_syntax  = get_bits1(gbc);
508    s->dba_syntax        = get_bits1(gbc);
509    s->skip_syntax       = get_bits1(gbc);
510    parse_spx_atten_data = get_bits1(gbc);
511
512    /* coupling strategy occurrence and coupling use per block */
513    num_cpl_blocks = 0;
514    if (s->channel_mode > 1) {
515        for (blk = 0; blk < s->num_blocks; blk++) {
516            s->cpl_strategy_exists[blk] = (!blk || get_bits1(gbc));
517            if (s->cpl_strategy_exists[blk]) {
518                s->cpl_in_use[blk] = get_bits1(gbc);
519            } else {
520                s->cpl_in_use[blk] = s->cpl_in_use[blk-1];
521            }
522            num_cpl_blocks += s->cpl_in_use[blk];
523        }
524    } else {
525        memset(s->cpl_in_use, 0, sizeof(s->cpl_in_use));
526    }
527
528    /* exponent strategy data */
529    if (ac3_exponent_strategy) {
530        /* AC-3-style exponent strategy syntax */
531        for (blk = 0; blk < s->num_blocks; blk++) {
532            for (ch = !s->cpl_in_use[blk]; ch <= s->fbw_channels; ch++) {
533                s->exp_strategy[blk][ch] = get_bits(gbc, 2);
534            }
535        }
536    } else {
537        /* LUT-based exponent strategy syntax */
538        for (ch = !((s->channel_mode > 1) && num_cpl_blocks); ch <= s->fbw_channels; ch++) {
539            int frmchexpstr = get_bits(gbc, 5);
540            for (blk = 0; blk < 6; blk++) {
541                s->exp_strategy[blk][ch] = ff_eac3_frm_expstr[frmchexpstr][blk];
542            }
543        }
544    }
545    /* LFE exponent strategy */
546    if (s->lfe_on) {
547        for (blk = 0; blk < s->num_blocks; blk++) {
548            s->exp_strategy[blk][s->lfe_ch] = get_bits1(gbc);
549        }
550    }
551    /* original exponent strategies if this stream was converted from AC-3 */
552    if (s->frame_type == EAC3_FRAME_TYPE_INDEPENDENT &&
553            (s->num_blocks == 6 || get_bits1(gbc))) {
554        skip_bits(gbc, 5 * s->fbw_channels); // skip converter channel exponent strategy
555    }
556
557    /* determine which channels use AHT */
558    if (parse_aht_info) {
559        /* For AHT to be used, all non-zero blocks must reuse exponents from
560           the first block.  Furthermore, for AHT to be used in the coupling
561           channel, all blocks must use coupling and use the same coupling
562           strategy. */
563        s->channel_uses_aht[CPL_CH]=0;
564        for (ch = (num_cpl_blocks != 6); ch <= s->channels; ch++) {
565            int use_aht = 1;
566            for (blk = 1; blk < 6; blk++) {
567                if ((s->exp_strategy[blk][ch] != EXP_REUSE) ||
568                        (!ch && s->cpl_strategy_exists[blk])) {
569                    use_aht = 0;
570                    break;
571                }
572            }
573            s->channel_uses_aht[ch] = use_aht && get_bits1(gbc);
574        }
575    } else {
576        memset(s->channel_uses_aht, 0, sizeof(s->channel_uses_aht));
577    }
578
579    /* per-frame SNR offset */
580    if (!s->snr_offset_strategy) {
581        int csnroffst = (get_bits(gbc, 6) - 15) << 4;
582        int snroffst = (csnroffst + get_bits(gbc, 4)) << 2;
583        for (ch = 0; ch <= s->channels; ch++)
584            s->snr_offset[ch] = snroffst;
585    }
586
587    /* transient pre-noise processing data */
588    if (parse_transient_proc_info) {
589        for (ch = 1; ch <= s->fbw_channels; ch++) {
590            if (get_bits1(gbc)) { // channel in transient processing
591                skip_bits(gbc, 10); // skip transient processing location
592                skip_bits(gbc, 8);  // skip transient processing length
593            }
594        }
595    }
596
597    /* spectral extension attenuation data */
598    for (ch = 1; ch <= s->fbw_channels; ch++) {
599        if (parse_spx_atten_data && get_bits1(gbc)) {
600            s->spx_atten_code[ch] = get_bits(gbc, 5);
601        } else {
602            s->spx_atten_code[ch] = -1;
603        }
604    }
605
606    /* block start information */
607    if (s->num_blocks > 1 && get_bits1(gbc)) {
608        /* reference: Section E2.3.2.27
609           nblkstrtbits = (numblks - 1) * (4 + ceiling(log2(words_per_frame)))
610           The spec does not say what this data is or what it's used for.
611           It is likely the offset of each block within the frame. */
612        int block_start_bits = (s->num_blocks-1) * (4 + av_log2(s->frame_size-2));
613        skip_bits_long(gbc, block_start_bits);
614        avpriv_request_sample(s->avctx, "Block start info");
615    }
616
617    /* syntax state initialization */
618    for (ch = 1; ch <= s->fbw_channels; ch++) {
619        s->first_spx_coords[ch] = 1;
620        s->first_cpl_coords[ch] = 1;
621    }
622    s->first_cpl_leak = 1;
623
624    return 0;
625}
626