76 #define PARAM_BLOCKSIZE (1 << 7)
77 #define PARAM_MATRIX (1 << 6)
78 #define PARAM_OUTSHIFT (1 << 5)
79 #define PARAM_QUANTSTEP (1 << 4)
80 #define PARAM_FIR (1 << 3)
81 #define PARAM_IIR (1 << 2)
82 #define PARAM_HUFFOFFSET (1 << 1)
83 #define PARAM_PRESENCE (1 << 0)
188 if (!huff_vlc[0].
bits) {
204 unsigned int substr,
unsigned int ch)
213 sign_huff_offset -= 7 << lsb_bits;
216 sign_huff_offset -= 1 << sign_shift;
218 return sign_huff_offset;
225 unsigned int substr,
unsigned int pos)
228 unsigned int mat, channel;
234 for (channel = s->
min_channel; channel <= s->max_channel; channel++) {
238 int lsb_bits = cp->
huff_lsbs - quant_step_size;
242 result =
get_vlc2(gbp, huff_vlc[codebook-1].table,
249 result = (result << lsb_bits) +
get_bits(gbp, lsb_bits);
252 result <<= quant_step_size;
296 "Channel group 2 cannot have more bits per sample than group 1.\n");
302 "Channel groups with differing sample rates are not currently supported.\n");
312 "Sampling rate %d is greater than the supported maximum (%d).\n",
318 "Block size %d is greater than the supported maximum (%d).\n",
324 "Block size pow2 %d is greater than the supported maximum (%d).\n",
337 "Number of substreams %d is larger than the maximum supported "
387 const uint8_t *buf,
unsigned int substr)
395 int min_channel, max_channel, max_matrix_channel;
402 if (sync_word != 0x31ea >> 1) {
404 "restart header sync incorrect (got 0x%04x)\n", sync_word);
419 max_matrix_channel =
get_bits(gbp, 4);
421 if (max_matrix_channel > std_max_matrix_channel) {
423 "Max matrix channel cannot be greater than %d.\n",
428 if (max_channel != max_matrix_channel) {
430 "Max channel must be equal max matrix channel.\n");
438 "Number of channels %d is larger than the maximum supported "
443 if (min_channel > max_channel) {
445 "Substream min channel cannot be greater than max channel.\n");
454 if (m->
avctx->request_channels > 0 &&
458 "Extracting %d channel downmix from substream %d. "
459 "Further substreams will be skipped.\n",
474 if (tmp != lossless_check)
476 "Lossless check failed - expected %02x, calculated %02x.\n",
477 lossless_check, tmp);
494 "Assignment of matrix channel %d to invalid output channel %d.\n",
515 for (ch = s->
min_channel; ch <= s->max_channel; ch++) {
540 unsigned int substr,
unsigned int channel,
546 const char fchar = filter ?
'I' :
'F';
558 if (order > max_order) {
560 "%cIR filter order %d is greater than maximum %d.\n",
561 fchar, order, max_order);
568 int coeff_bits, coeff_shift;
574 if (coeff_bits < 1 || coeff_bits > 16) {
576 "%cIR filter coeff_bits must be between 1 and 16.\n",
580 if (coeff_bits + coeff_shift > 16) {
582 "Sum of coeff_bits and coeff_shift for %cIR filter must be 16 or less.\n",
587 for (i = 0; i < order; i++)
588 fcoeff[i] =
get_sbits(gbp, coeff_bits) << coeff_shift;
591 int state_bits, state_shift;
595 "FIR filter has state data specified.\n");
604 for (i = 0; i < order; i++)
617 unsigned int mat, ch;
631 "Number of primitive matrices cannot be greater than %d.\n",
632 max_primitive_matrices);
637 int frac_bits, max_chan;
644 "Invalid channel %d specified as output from matrix.\n",
648 if (frac_bits > 14) {
650 "Too many fractional bits specified.\n");
658 for (ch = 0; ch <= max_chan; ch++) {
661 coeff_val =
get_sbits(gbp, frac_bits + 2);
663 s->
matrix_coeff[mat][ch] = coeff_val << (14 - frac_bits);
704 "FIR and IIR filters must use the same precision.\n");
776 for (ch = s->
min_channel; ch <= s->max_channel; ch++)
784 #define MSB_MASK(bits) (-1u << bits)
790 unsigned int channel)
799 unsigned int filter_shift = fir->
shift;
820 unsigned int i, ch, expected_stream_pos = 0;
825 expected_stream_pos +=
get_bits(gbp, 16);
827 "we have not tested yet.\n");
842 for (ch = s->
min_channel; ch <= s->max_channel; ch++)
859 30, 51, 22, 54, 3, 7, -4, 38, 14, 55, 46, 81, 22, 58, -3, 2,
860 52, 31, -7, 51, 15, 44, 74, 30, 85, -17, 10, 33, 18, 80, 28, 62,
861 10, 32, 23, 69, 72, 26, 35, 17, 73, 60, 8, 56, 2, 6, -2, -5,
862 51, 4, 11, 50, 66, 76, 21, 44, 33, 47, 1, 26, 64, 48, 57, 40,
863 38, 16, -10, -28, 92, 22, -18, 29, -10, 5, -13, 49, 19, 24, 70, 34,
864 61, 48, 30, 14, -6, 25, 58, 33, 42, 60, 67, 17, 54, 17, 22, 30,
865 67, 44, -9, 50, -11, 43, 40, 32, 59, 82, 13, 49, -14, 55, 60, 36,
866 48, 49, 31, 47, 15, 12, 4, 65, 1, 23, 29, 39, 45, -2, 84, 69,
867 0, 72, 37, 57, 27, 41, -15, -16, 35, 31, 14, 61, 24, 0, 27, 24,
868 16, 41, 55, 34, 53, 9, 56, 12, 25, 29, 53, 5, 20, -20, -8, 20,
869 13, 28, -3, 78, 38, 16, 11, 62, 46, 29, 21, 24, 46, 65, 43, -23,
870 89, 18, 74, 21, 38, -12, 19, 12, -19, 8, 15, 33, 4, 57, 9, -8,
871 36, 35, 26, 28, 7, 83, 63, 79, 75, 11, 3, 87, 37, 47, 34, 40,
872 39, 19, 20, 42, 27, 34, 39, 77, 13, 42, 59, 64, 45, -1, 32, 37,
873 45, -5, 53, -6, 7, 36, 50, 23, 6, 32, 9, -21, 18, 71, 27, 52,
874 -25, 31, 35, 42, -1, 68, 63, 52, 26, 43, 66, 37, 41, 25, 40, 70,
895 uint16_t seed_shr7 = seed >> 7;
899 seed = (seed << 16) ^ seed_shr7 ^ (seed_shr7 << 5);
914 uint8_t seed_shr15 = seed >> 15;
916 seed = (seed << 8) ^ seed_shr15 ^ (seed_shr15 << 5);
929 unsigned int mat, src_ch, i;
930 unsigned int maxchan;
946 int index2 = 2 * index + 1;
955 for (src_ch = 0; src_ch <= maxchan; src_ch++)
956 accum += (int64_t) samples[src_ch] * coeffs[src_ch];
958 if (matrix_noise_shift) {
964 samples[dest_ch] = ((accum >> 14) & mask) + bypassed_lsb;
972 void *
data,
int *got_frame_ptr)
976 unsigned int i, out_ch = 0;
1001 for (i = 0; i < s->
blockpos; i++) {
1007 if (is32) *data_32++ = sample << 8;
1008 else *data_16++ = sample >> 8;
1023 int *got_frame_ptr,
AVPacket *avpkt)
1026 int buf_size = avpkt->
size;
1029 unsigned int length, substr;
1030 unsigned int substream_start;
1031 unsigned int header_size = 4;
1032 unsigned int substr_header_size = 0;
1041 length = (
AV_RB16(buf) & 0xfff) * 2;
1043 if (length < 4 || length > buf_size)
1058 "Stream parameters not seen; skipping frame.\n");
1063 substream_start = 0;
1066 int extraword_present, checkdata_present, end, nonrestart_substr;
1075 substr_header_size += 2;
1077 if (extraword_present) {
1083 substr_header_size += 2;
1091 if (end + header_size + substr_header_size > length) {
1093 "Indicated length of substream %d data goes off end of "
1094 "packet.\n", substr);
1095 end = length - header_size - substr_header_size;
1098 if (end < substream_start) {
1100 "Indicated end offset of substream %d data "
1101 "is smaller than calculated start offset.\n",
1109 substream_parity_present[substr] = checkdata_present;
1110 substream_data_len[substr] = end - substream_start;
1111 substream_start = end;
1117 if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) {
1122 buf += header_size + substr_header_size;
1154 goto substream_length_mismatch;
1160 if (substream_data_len[substr] * 8 -
get_bits_count(&gb) >= 32) {
1176 if (substream_parity_present[substr]) {
1180 goto substream_length_mismatch;
1185 if ((
get_bits(&gb, 8) ^ parity) != 0xa9 )
1192 goto substream_length_mismatch;
1197 "No restart header present in substream %d.\n", substr);
1199 buf += substream_data_len[substr];
1209 substream_length_mismatch:
1229 #if CONFIG_TRUEHD_DECODER
1237 .capabilities = CODEC_CAP_DR1,