44 "Please file a bug report following the instructions at "
45 "http://libav.org/bugreports.html and include "
46 "a sample of this file.";
79 #define PARAM_BLOCKSIZE (1 << 7)
80 #define PARAM_MATRIX (1 << 6)
81 #define PARAM_OUTSHIFT (1 << 5)
82 #define PARAM_QUANTSTEP (1 << 4)
83 #define PARAM_FIR (1 << 3)
84 #define PARAM_IIR (1 << 2)
85 #define PARAM_HUFFOFFSET (1 << 1)
86 #define PARAM_PRESENCE (1 << 0)
161 if (!huff_vlc[0].
bits) {
177 unsigned int substr,
unsigned int ch)
186 sign_huff_offset -= 7 << lsb_bits;
189 sign_huff_offset -= 1 << sign_shift;
191 return sign_huff_offset;
198 unsigned int substr,
unsigned int pos)
201 unsigned int mat, channel;
207 for (channel = s->
min_channel; channel <= s->max_channel; channel++) {
211 int lsb_bits = cp->
huff_lsbs - quant_step_size;
215 result =
get_vlc2(gbp, huff_vlc[codebook-1].table,
222 result = (result << lsb_bits) +
get_bits(gbp, lsb_bits);
225 result <<= quant_step_size;
269 "Channel group 2 cannot have more bits per sample than group 1.\n");
275 "Channel groups with differing sample rates are not currently supported.\n");
285 "Sampling rate %d is greater than the supported maximum (%d).\n",
291 "Block size %d is greater than the supported maximum (%d).\n",
297 "Block size pow2 %d is greater than the supported maximum (%d).\n",
310 "Number of substreams %d is larger than the maximum supported "
342 const uint8_t *buf,
unsigned int substr)
348 uint8_t lossless_check;
350 int min_channel, max_channel, max_matrix_channel;
357 if (sync_word != 0x31ea >> 1) {
359 "restart header sync incorrect (got 0x%04x)\n", sync_word);
374 max_matrix_channel =
get_bits(gbp, 4);
376 if (max_matrix_channel > std_max_matrix_channel) {
378 "Max matrix channel cannot be greater than %d.\n",
383 if (max_channel != max_matrix_channel) {
385 "Max channel must be equal max matrix channel.\n");
393 "Number of channels %d is larger than the maximum supported "
398 if (min_channel > max_channel) {
400 "Substream min channel cannot be greater than max channel.\n");
409 if (m->
avctx->request_channels > 0 &&
413 "Extracting %d channel downmix from substream %d. "
414 "Further substreams will be skipped.\n",
429 if (tmp != lossless_check)
431 "Lossless check failed - expected %02x, calculated %02x.\n",
432 lossless_check, tmp);
443 "Assignment of matrix channel %d to invalid output channel %d. %s\n",
464 for (ch = s->
min_channel; ch <= s->max_channel; ch++) {
487 unsigned int substr,
unsigned int channel,
493 const char fchar = filter ?
'I' :
'F';
505 if (order > max_order) {
507 "%cIR filter order %d is greater than maximum %d.\n",
508 fchar, order, max_order);
515 int coeff_bits, coeff_shift;
521 if (coeff_bits < 1 || coeff_bits > 16) {
523 "%cIR filter coeff_bits must be between 1 and 16.\n",
527 if (coeff_bits + coeff_shift > 16) {
529 "Sum of coeff_bits and coeff_shift for %cIR filter must be 16 or less.\n",
534 for (i = 0; i < order; i++)
535 fcoeff[i] =
get_sbits(gbp, coeff_bits) << coeff_shift;
538 int state_bits, state_shift;
542 "FIR filter has state data specified.\n");
551 for (i = 0; i < order; i++)
564 unsigned int mat, ch;
578 "Number of primitive matrices cannot be greater than %d.\n",
579 max_primitive_matrices);
584 int frac_bits, max_chan;
591 "Invalid channel %d specified as output from matrix.\n",
595 if (frac_bits > 14) {
597 "Too many fractional bits specified.\n");
605 for (ch = 0; ch <= max_chan; ch++) {
608 coeff_val =
get_sbits(gbp, frac_bits + 2);
610 s->
matrix_coeff[mat][ch] = coeff_val << (14 - frac_bits);
651 "FIR and IIR filters must use the same precision.\n");
723 for (ch = s->
min_channel; ch <= s->max_channel; ch++)
731 #define MSB_MASK(bits) (-1u << bits)
737 unsigned int channel)
746 unsigned int filter_shift = fir->
shift;
767 unsigned int i, ch, expected_stream_pos = 0;
772 expected_stream_pos +=
get_bits(gbp, 16);
789 for (ch = s->
min_channel; ch <= s->max_channel; ch++)
806 30, 51, 22, 54, 3, 7, -4, 38, 14, 55, 46, 81, 22, 58, -3, 2,
807 52, 31, -7, 51, 15, 44, 74, 30, 85, -17, 10, 33, 18, 80, 28, 62,
808 10, 32, 23, 69, 72, 26, 35, 17, 73, 60, 8, 56, 2, 6, -2, -5,
809 51, 4, 11, 50, 66, 76, 21, 44, 33, 47, 1, 26, 64, 48, 57, 40,
810 38, 16, -10, -28, 92, 22, -18, 29, -10, 5, -13, 49, 19, 24, 70, 34,
811 61, 48, 30, 14, -6, 25, 58, 33, 42, 60, 67, 17, 54, 17, 22, 30,
812 67, 44, -9, 50, -11, 43, 40, 32, 59, 82, 13, 49, -14, 55, 60, 36,
813 48, 49, 31, 47, 15, 12, 4, 65, 1, 23, 29, 39, 45, -2, 84, 69,
814 0, 72, 37, 57, 27, 41, -15, -16, 35, 31, 14, 61, 24, 0, 27, 24,
815 16, 41, 55, 34, 53, 9, 56, 12, 25, 29, 53, 5, 20, -20, -8, 20,
816 13, 28, -3, 78, 38, 16, 11, 62, 46, 29, 21, 24, 46, 65, 43, -23,
817 89, 18, 74, 21, 38, -12, 19, 12, -19, 8, 15, 33, 4, 57, 9, -8,
818 36, 35, 26, 28, 7, 83, 63, 79, 75, 11, 3, 87, 37, 47, 34, 40,
819 39, 19, 20, 42, 27, 34, 39, 77, 13, 42, 59, 64, 45, -1, 32, 37,
820 45, -5, 53, -6, 7, 36, 50, 23, 6, 32, 9, -21, 18, 71, 27, 52,
821 -25, 31, 35, 42, -1, 68, 63, 52, 26, 43, 66, 37, 41, 25, 40, 70,
842 uint16_t seed_shr7 = seed >> 7;
846 seed = (seed << 16) ^ seed_shr7 ^ (seed_shr7 << 5);
861 uint8_t seed_shr15 = seed >> 15;
863 seed = (seed << 8) ^ seed_shr15 ^ (seed_shr15 << 5);
876 unsigned int mat, src_ch, i;
877 unsigned int maxchan;
893 int index2 = 2 * index + 1;
902 for (src_ch = 0; src_ch <= maxchan; src_ch++)
903 accum += (int64_t) samples[src_ch] * coeffs[src_ch];
905 if (matrix_noise_shift) {
911 samples[dest_ch] = ((accum >> 14) & mask) + bypassed_lsb;
919 void *
data,
int *got_frame_ptr)
923 unsigned int i, out_ch = 0;
949 if (is32) *data_32++ = sample << 8;
950 else *data_16++ = sample >> 8;
965 int *got_frame_ptr,
AVPacket *avpkt)
967 const uint8_t *buf = avpkt->
data;
968 int buf_size = avpkt->
size;
971 unsigned int length, substr;
972 unsigned int substream_start;
973 unsigned int header_size = 4;
974 unsigned int substr_header_size = 0;
983 length = (
AV_RB16(buf) & 0xfff) * 2;
985 if (length < 4 || length > buf_size)
1000 "Stream parameters not seen; skipping frame.\n");
1005 substream_start = 0;
1008 int extraword_present, checkdata_present, end, nonrestart_substr;
1017 substr_header_size += 2;
1019 if (extraword_present) {
1025 substr_header_size += 2;
1033 if (end + header_size + substr_header_size > length) {
1035 "Indicated length of substream %d data goes off end of "
1036 "packet.\n", substr);
1037 end = length - header_size - substr_header_size;
1040 if (end < substream_start) {
1042 "Indicated end offset of substream %d data "
1043 "is smaller than calculated start offset.\n",
1051 substream_parity_present[substr] = checkdata_present;
1052 substream_data_len[substr] = end - substream_start;
1053 substream_start = end;
1059 if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) {
1064 buf += header_size + substr_header_size;
1096 goto substream_length_mismatch;
1102 if (substream_data_len[substr] * 8 -
get_bits_count(&gb) >= 32) {
1118 if (substream_parity_present[substr]) {
1119 uint8_t parity, checksum;
1122 goto substream_length_mismatch;
1127 if ((
get_bits(&gb, 8) ^ parity) != 0xa9 )
1134 goto substream_length_mismatch;
1139 "No restart header present in substream %d.\n", substr);
1141 buf += substream_data_len[substr];
1151 substream_length_mismatch:
1171 #if CONFIG_TRUEHD_DECODER