MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / parse_coding_header

Function parse_coding_header

libavcodec/dca_core.c:154–348  ·  view source on GitHub ↗

5.3.2 - Primary audio coding header

Source from the content-addressed store, hash-verified

152
153// 5.3.2 - Primary audio coding header
154static 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

Callers 1

parse_frame_dataFunction · 0.85

Calls 10

get_bits_countFunction · 0.85
get_bits_leftFunction · 0.85
av_logFunction · 0.85
ff_dca_check_crcFunction · 0.85
avpriv_request_sampleFunction · 0.85
get_bits_longFunction · 0.85
get_bits1Function · 0.85
ff_dca_seek_bitsFunction · 0.85
skip_bitsFunction · 0.85
get_bitsFunction · 0.70

Tested by

no test coverage detected