43 "Please file a bug report following the instructions at "
44 "http://libav.org/bugreports.html and include "
45 "a sample of this file.";
78 #define PARAM_BLOCKSIZE (1 << 7)
79 #define PARAM_MATRIX (1 << 6)
80 #define PARAM_OUTSHIFT (1 << 5)
81 #define PARAM_QUANTSTEP (1 << 4)
82 #define PARAM_FIR (1 << 3)
83 #define PARAM_IIR (1 << 2)
84 #define PARAM_HUFFOFFSET (1 << 1)
85 #define PARAM_PRESENCE (1 << 0)
160 if (!huff_vlc[0].
bits) {
176 unsigned int substr,
unsigned int ch)
185 sign_huff_offset -= 7 << lsb_bits;
188 sign_huff_offset -= 1 << sign_shift;
190 return sign_huff_offset;
197 unsigned int substr,
unsigned int pos)
200 unsigned int mat, channel;
206 for (channel = s->
min_channel; channel <= s->max_channel; channel++) {
210 int lsb_bits = cp->
huff_lsbs - quant_step_size;
214 result =
get_vlc2(gbp, huff_vlc[codebook-1].table,
221 result = (result << lsb_bits) +
get_bits(gbp, lsb_bits);
224 result <<= quant_step_size;
268 "Channel group 2 cannot have more bits per sample than group 1.\n");
274 "Channel groups with differing sample rates are not currently supported.\n");
284 "Sampling rate %d is greater than the supported maximum (%d).\n",
290 "Block size %d is greater than the supported maximum (%d).\n",
296 "Block size pow2 %d is greater than the supported maximum (%d).\n",
309 "Number of substreams %d is larger than the maximum supported "
341 const uint8_t *buf,
unsigned int substr)
347 uint8_t lossless_check;
349 int min_channel, max_channel, max_matrix_channel;
356 if (sync_word != 0x31ea >> 1) {
358 "restart header sync incorrect (got 0x%04x)\n", sync_word);
373 max_matrix_channel =
get_bits(gbp, 4);
375 if (max_matrix_channel > std_max_matrix_channel) {
377 "Max matrix channel cannot be greater than %d.\n",
382 if (max_channel != max_matrix_channel) {
384 "Max channel must be equal max matrix channel.\n");
392 "Number of channels %d is larger than the maximum supported "
397 if (min_channel > max_channel) {
399 "Substream min channel cannot be greater than max channel.\n");
408 if (m->
avctx->request_channels > 0 &&
412 "Extracting %d channel downmix from substream %d. "
413 "Further substreams will be skipped.\n",
428 if (tmp != lossless_check)
430 "Lossless check failed - expected %02x, calculated %02x.\n",
431 lossless_check, tmp);
442 "Assignment of matrix channel %d to invalid output channel %d. %s\n",
463 for (ch = s->
min_channel; ch <= s->max_channel; ch++) {
486 unsigned int substr,
unsigned int channel,
492 const char fchar = filter ?
'I' :
'F';
504 if (order > max_order) {
506 "%cIR filter order %d is greater than maximum %d.\n",
507 fchar, order, max_order);
514 int coeff_bits, coeff_shift;
520 if (coeff_bits < 1 || coeff_bits > 16) {
522 "%cIR filter coeff_bits must be between 1 and 16.\n",
526 if (coeff_bits + coeff_shift > 16) {
528 "Sum of coeff_bits and coeff_shift for %cIR filter must be 16 or less.\n",
533 for (i = 0; i < order; i++)
534 fcoeff[i] =
get_sbits(gbp, coeff_bits) << coeff_shift;
537 int state_bits, state_shift;
541 "FIR filter has state data specified.\n");
550 for (i = 0; i < order; i++)
563 unsigned int mat, ch;
577 "Number of primitive matrices cannot be greater than %d.\n",
578 max_primitive_matrices);
583 int frac_bits, max_chan;
590 "Invalid channel %d specified as output from matrix.\n",
594 if (frac_bits > 14) {
596 "Too many fractional bits specified.\n");
604 for (ch = 0; ch <= max_chan; ch++) {
607 coeff_val =
get_sbits(gbp, frac_bits + 2);
609 s->
matrix_coeff[mat][ch] = coeff_val << (14 - frac_bits);
650 "FIR and IIR filters must use the same precision.\n");
722 for (ch = s->
min_channel; ch <= s->max_channel; ch++)
730 #define MSB_MASK(bits) (-1u << bits)
736 unsigned int channel)
745 unsigned int filter_shift = fir->
shift;
766 unsigned int i, ch, expected_stream_pos = 0;
771 expected_stream_pos +=
get_bits(gbp, 16);
788 for (ch = s->
min_channel; ch <= s->max_channel; ch++)
805 30, 51, 22, 54, 3, 7, -4, 38, 14, 55, 46, 81, 22, 58, -3, 2,
806 52, 31, -7, 51, 15, 44, 74, 30, 85, -17, 10, 33, 18, 80, 28, 62,
807 10, 32, 23, 69, 72, 26, 35, 17, 73, 60, 8, 56, 2, 6, -2, -5,
808 51, 4, 11, 50, 66, 76, 21, 44, 33, 47, 1, 26, 64, 48, 57, 40,
809 38, 16, -10, -28, 92, 22, -18, 29, -10, 5, -13, 49, 19, 24, 70, 34,
810 61, 48, 30, 14, -6, 25, 58, 33, 42, 60, 67, 17, 54, 17, 22, 30,
811 67, 44, -9, 50, -11, 43, 40, 32, 59, 82, 13, 49, -14, 55, 60, 36,
812 48, 49, 31, 47, 15, 12, 4, 65, 1, 23, 29, 39, 45, -2, 84, 69,
813 0, 72, 37, 57, 27, 41, -15, -16, 35, 31, 14, 61, 24, 0, 27, 24,
814 16, 41, 55, 34, 53, 9, 56, 12, 25, 29, 53, 5, 20, -20, -8, 20,
815 13, 28, -3, 78, 38, 16, 11, 62, 46, 29, 21, 24, 46, 65, 43, -23,
816 89, 18, 74, 21, 38, -12, 19, 12, -19, 8, 15, 33, 4, 57, 9, -8,
817 36, 35, 26, 28, 7, 83, 63, 79, 75, 11, 3, 87, 37, 47, 34, 40,
818 39, 19, 20, 42, 27, 34, 39, 77, 13, 42, 59, 64, 45, -1, 32, 37,
819 45, -5, 53, -6, 7, 36, 50, 23, 6, 32, 9, -21, 18, 71, 27, 52,
820 -25, 31, 35, 42, -1, 68, 63, 52, 26, 43, 66, 37, 41, 25, 40, 70,
841 uint16_t seed_shr7 = seed >> 7;
845 seed = (seed << 16) ^ seed_shr7 ^ (seed_shr7 << 5);
860 uint8_t seed_shr15 = seed >> 15;
862 seed = (seed << 8) ^ seed_shr15 ^ (seed_shr15 << 5);
875 unsigned int mat, src_ch, i;
876 unsigned int maxchan;
892 int index2 = 2 * index + 1;
901 for (src_ch = 0; src_ch <= maxchan; src_ch++)
902 accum += (int64_t) samples[src_ch] * coeffs[src_ch];
904 if (matrix_noise_shift) {
910 samples[dest_ch] = ((accum >> 14) & mask) + bypassed_lsb;
918 void *
data,
int *got_frame_ptr)
922 unsigned int i, out_ch = 0;
948 if (is32) *data_32++ = sample << 8;
949 else *data_16++ = sample >> 8;
964 int *got_frame_ptr,
AVPacket *avpkt)
966 const uint8_t *buf = avpkt->
data;
967 int buf_size = avpkt->
size;
970 unsigned int length, substr;
971 unsigned int substream_start;
972 unsigned int header_size = 4;
973 unsigned int substr_header_size = 0;
982 length = (
AV_RB16(buf) & 0xfff) * 2;
984 if (length < 4 || length > buf_size)
999 "Stream parameters not seen; skipping frame.\n");
1004 substream_start = 0;
1007 int extraword_present, checkdata_present, end, nonrestart_substr;
1016 substr_header_size += 2;
1018 if (extraword_present) {
1024 substr_header_size += 2;
1032 if (end + header_size + substr_header_size > length) {
1034 "Indicated length of substream %d data goes off end of "
1035 "packet.\n", substr);
1036 end = length - header_size - substr_header_size;
1039 if (end < substream_start) {
1041 "Indicated end offset of substream %d data "
1042 "is smaller than calculated start offset.\n",
1050 substream_parity_present[substr] = checkdata_present;
1051 substream_data_len[substr] = end - substream_start;
1052 substream_start = end;
1058 if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) {
1063 buf += header_size + substr_header_size;
1095 goto substream_length_mismatch;
1101 if (substream_data_len[substr] * 8 -
get_bits_count(&gb) >= 32) {
1117 if (substream_parity_present[substr]) {
1118 uint8_t parity, checksum;
1121 goto substream_length_mismatch;
1126 if ((
get_bits(&gb, 8) ^ parity) != 0xa9 )
1133 goto substream_length_mismatch;
1138 "No restart header present in substream %d.\n", substr);
1140 buf += substream_data_len[substr];
1150 substream_length_mismatch:
1170 #if CONFIG_TRUEHD_DECODER