5.3.2 - Primary audio coding header
| 152 | |
| 153 | // 5.3.2 - Primary audio coding header |
| 154 | static int parse_coding_header(DCACoreDecoder *s, enum HeaderType header, int xch_base) |
| 155 | { |
| 156 | int n, ch, nchannels, header_size = 0, header_pos = get_bits_count(&s->gb); |
| 157 | unsigned int mask, index; |
| 158 | |
| 159 | if (get_bits_left(&s->gb) < 0) |
| 160 | return AVERROR_INVALIDDATA; |
| 161 | |
| 162 | switch (header) { |
| 163 | case HEADER_CORE: |
| 164 | // Number of subframes |
| 165 | s->nsubframes = get_bits(&s->gb, 4) + 1; |
| 166 | |
| 167 | // Number of primary audio channels |
| 168 | s->nchannels = get_bits(&s->gb, 3) + 1; |
| 169 | if (s->nchannels != ff_dca_channels[s->audio_mode]) { |
| 170 | av_log(s->avctx, AV_LOG_ERROR, "Invalid number of primary audio channels (%d) for audio channel arrangement (%d)\n", s->nchannels, s->audio_mode); |
| 171 | return AVERROR_INVALIDDATA; |
| 172 | } |
| 173 | av_assert1(s->nchannels <= DCA_CHANNELS - 2); |
| 174 | |
| 175 | s->ch_mask = audio_mode_ch_mask[s->audio_mode]; |
| 176 | |
| 177 | // Add LFE channel if present |
| 178 | if (s->lfe_present) |
| 179 | s->ch_mask |= DCA_SPEAKER_MASK_LFE1; |
| 180 | break; |
| 181 | |
| 182 | case HEADER_XCH: |
| 183 | s->nchannels = ff_dca_channels[s->audio_mode] + 1; |
| 184 | av_assert1(s->nchannels <= DCA_CHANNELS - 1); |
| 185 | s->ch_mask |= DCA_SPEAKER_MASK_Cs; |
| 186 | break; |
| 187 | |
| 188 | case HEADER_XXCH: |
| 189 | // Channel set header length |
| 190 | header_size = get_bits(&s->gb, 7) + 1; |
| 191 | |
| 192 | // Check CRC |
| 193 | if (s->xxch_crc_present |
| 194 | && ff_dca_check_crc(s->avctx, &s->gb, header_pos, header_pos + header_size * 8)) { |
| 195 | av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH channel set header checksum\n"); |
| 196 | return AVERROR_INVALIDDATA; |
| 197 | } |
| 198 | |
| 199 | // Number of channels in a channel set |
| 200 | nchannels = get_bits(&s->gb, 3) + 1; |
| 201 | if (nchannels > DCA_XXCH_CHANNELS_MAX) { |
| 202 | avpriv_request_sample(s->avctx, "%d XXCH channels", nchannels); |
| 203 | return AVERROR_PATCHWELCOME; |
| 204 | } |
| 205 | s->nchannels = ff_dca_channels[s->audio_mode] + nchannels; |
| 206 | av_assert1(s->nchannels <= DCA_CHANNELS); |
| 207 | |
| 208 | // Loudspeaker layout mask |
| 209 | mask = get_bits_long(&s->gb, s->xxch_mask_nbits - DCA_SPEAKER_Cs); |
| 210 | s->xxch_spkr_mask = mask << DCA_SPEAKER_Cs; |
| 211 |
no test coverage detected