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)
191 if (!huff_vlc[0].
bits) {
207 unsigned int substr,
unsigned int ch)
216 sign_huff_offset -= 7 << lsb_bits;
219 sign_huff_offset -= 1 << sign_shift;
221 return sign_huff_offset;
228 unsigned int substr,
unsigned int pos)
231 unsigned int mat, channel;
237 for (channel = s->
min_channel; channel <= s->max_channel; channel++) {
241 int lsb_bits = cp->
huff_lsbs - quant_step_size;
252 result = (result << lsb_bits) +
get_bits(gbp, lsb_bits);
255 result <<= quant_step_size;
299 "Channel group 2 cannot have more bits per sample than group 1.\n");
305 "Channel groups with differing sample rates are not currently supported.\n");
315 "Sampling rate %d is greater than the supported maximum (%d).\n",
321 "Block size %d is greater than the supported maximum (%d).\n",
327 "Block size pow2 %d is greater than the supported maximum (%d).\n",
340 "Number of substreams %d is larger than the maximum supported "
399 const uint8_t *buf,
unsigned int substr)
410 int max_channel, min_channel, matrix_channel;
414 if (sync_word != 0x31ea >> 1) {
416 "restart header sync incorrect (got 0x%04x)\n", sync_word);
433 if (matrix_channel > max_matrix_channel) {
435 "Max matrix channel cannot be greater than %d.\n",
440 if (max_channel != matrix_channel) {
442 "Max channel must be equal max matrix channel.\n");
450 "Number of channels %d is larger than the maximum supported "
451 "by the decoder.\n", max_channel + 2);
455 if (min_channel > max_channel) {
457 "Substream min channel cannot be greater than max channel.\n");
465 if (m->
avctx->request_channels > 0
467 && substr < m->max_decoded_substream) {
469 "Extracting %d channel downmix from substream %d. "
470 "Further substreams will be skipped.\n",
485 if (tmp != lossless_check)
487 "Lossless check failed - expected %02x, calculated %02x.\n",
488 lossless_check, tmp);
505 "Assignment of matrix channel %d to invalid output channel %d.\n",
539 for (ch = s->
min_channel; ch <= s->max_channel; ch++) {
564 unsigned int substr,
unsigned int channel,
570 const char fchar = filter ?
'I' :
'F';
582 if (order > max_order) {
584 "%cIR filter order %d is greater than maximum %d.\n",
585 fchar, order, max_order);
592 int coeff_bits, coeff_shift;
598 if (coeff_bits < 1 || coeff_bits > 16) {
600 "%cIR filter coeff_bits must be between 1 and 16.\n",
604 if (coeff_bits + coeff_shift > 16) {
606 "Sum of coeff_bits and coeff_shift for %cIR filter must be 16 or less.\n",
611 for (i = 0; i < order; i++)
612 fcoeff[i] =
get_sbits(gbp, coeff_bits) << coeff_shift;
615 int state_bits, state_shift;
619 "FIR filter has state data specified.\n");
628 for (i = 0; i < order; i++)
641 unsigned int mat, ch;
655 "Number of primitive matrices cannot be greater than %d.\n",
656 max_primitive_matrices);
661 int frac_bits, max_chan;
668 "Invalid channel %d specified as output from matrix.\n",
672 if (frac_bits > 14) {
674 "Too many fractional bits specified.\n");
682 for (ch = 0; ch <= max_chan; ch++) {
685 coeff_val =
get_sbits(gbp, frac_bits + 2);
687 s->
matrix_coeff[mat][ch] = coeff_val << (14 - frac_bits);
728 "FIR and IIR filters must use the same precision.\n");
801 for (ch = s->
min_channel; ch <= s->max_channel; ch++)
809 #define MSB_MASK(bits) (-1u << bits)
815 unsigned int channel)
824 unsigned int filter_shift = fir->
shift;
845 unsigned int i, ch, expected_stream_pos = 0;
850 expected_stream_pos +=
get_bits(gbp, 16);
852 "we have not tested yet.\n");
867 for (ch = s->
min_channel; ch <= s->max_channel; ch++)
884 30, 51, 22, 54, 3, 7, -4, 38, 14, 55, 46, 81, 22, 58, -3, 2,
885 52, 31, -7, 51, 15, 44, 74, 30, 85, -17, 10, 33, 18, 80, 28, 62,
886 10, 32, 23, 69, 72, 26, 35, 17, 73, 60, 8, 56, 2, 6, -2, -5,
887 51, 4, 11, 50, 66, 76, 21, 44, 33, 47, 1, 26, 64, 48, 57, 40,
888 38, 16, -10, -28, 92, 22, -18, 29, -10, 5, -13, 49, 19, 24, 70, 34,
889 61, 48, 30, 14, -6, 25, 58, 33, 42, 60, 67, 17, 54, 17, 22, 30,
890 67, 44, -9, 50, -11, 43, 40, 32, 59, 82, 13, 49, -14, 55, 60, 36,
891 48, 49, 31, 47, 15, 12, 4, 65, 1, 23, 29, 39, 45, -2, 84, 69,
892 0, 72, 37, 57, 27, 41, -15, -16, 35, 31, 14, 61, 24, 0, 27, 24,
893 16, 41, 55, 34, 53, 9, 56, 12, 25, 29, 53, 5, 20, -20, -8, 20,
894 13, 28, -3, 78, 38, 16, 11, 62, 46, 29, 21, 24, 46, 65, 43, -23,
895 89, 18, 74, 21, 38, -12, 19, 12, -19, 8, 15, 33, 4, 57, 9, -8,
896 36, 35, 26, 28, 7, 83, 63, 79, 75, 11, 3, 87, 37, 47, 34, 40,
897 39, 19, 20, 42, 27, 34, 39, 77, 13, 42, 59, 64, 45, -1, 32, 37,
898 45, -5, 53, -6, 7, 36, 50, 23, 6, 32, 9, -21, 18, 71, 27, 52,
899 -25, 31, 35, 42, -1, 68, 63, 52, 26, 43, 66, 37, 41, 25, 40, 70,
920 uint16_t seed_shr7 = seed >> 7;
924 seed = (seed << 16) ^ seed_shr7 ^ (seed_shr7 << 5);
939 uint8_t seed_shr15 = seed >> 15;
941 seed = (seed << 8) ^ seed_shr15 ^ (seed_shr15 << 5);
954 unsigned int mat, src_ch, i;
955 unsigned int maxchan;
971 int index2 = 2 * index + 1;
980 for (src_ch = 0; src_ch <= maxchan; src_ch++)
981 accum += (int64_t) samples[src_ch] * coeffs[src_ch];
983 if (matrix_noise_shift) {
989 samples[dest_ch] = ((accum >> 14) & mask) + bypassed_lsb;
997 void *
data,
int *got_frame_ptr)
1001 unsigned int i, out_ch = 0;
1026 for (i = 0; i < s->
blockpos; i++) {
1032 if (is32) *data_32++ = sample << 8;
1033 else *data_16++ = sample >> 8;
1048 int *got_frame_ptr,
AVPacket *avpkt)
1051 int buf_size = avpkt->
size;
1054 unsigned int length, substr;
1055 unsigned int substream_start;
1056 unsigned int header_size = 4;
1057 unsigned int substr_header_size = 0;
1066 length = (
AV_RB16(buf) & 0xfff) * 2;
1068 if (length < 4 || length > buf_size)
1083 "Stream parameters not seen; skipping frame.\n");
1088 substream_start = 0;
1091 int extraword_present, checkdata_present,
end, nonrestart_substr;
1100 substr_header_size += 2;
1102 if (extraword_present) {
1108 substr_header_size += 2;
1116 if (end + header_size + substr_header_size > length) {
1118 "Indicated length of substream %d data goes off end of "
1119 "packet.\n", substr);
1120 end = length - header_size - substr_header_size;
1123 if (end < substream_start) {
1125 "Indicated end offset of substream %d data "
1126 "is smaller than calculated start offset.\n",
1134 substream_parity_present[substr] = checkdata_present;
1135 substream_data_len[substr] = end - substream_start;
1136 substream_start =
end;
1142 if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) {
1147 buf += header_size + substr_header_size;
1179 goto substream_length_mismatch;
1185 if (substream_data_len[substr] * 8 -
get_bits_count(&gb) >= 32) {
1201 if (substream_parity_present[substr]) {
1205 goto substream_length_mismatch;
1210 if ((
get_bits(&gb, 8) ^ parity) != 0xa9 )
1217 goto substream_length_mismatch;
1222 "No restart header present in substream %d.\n", substr);
1224 buf += substream_data_len[substr];
1234 substream_length_mismatch:
1243 #if CONFIG_MLP_DECODER
1255 #if CONFIG_TRUEHD_DECODER