annotate mlpdec.c @ 9868:5cc32c474caf libavcodec

Introduce WMACoef typedef for decoded coefficients and change default type to float so that the run level decoding functionality can be shared with wmapro
author faust3
date Sat, 20 Jun 2009 09:05:28 +0000
parents d0fe5dc427f0
children e16322231312
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1 /*
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
2 * MLP decoder
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
3 * Copyright (c) 2007-2008 Ian Caulfield
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
4 *
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
5 * This file is part of FFmpeg.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
6 *
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
11 *
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
15 * Lesser General Public License for more details.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
16 *
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
20 */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
21
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
22 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8693
diff changeset
23 * @file libavcodec/mlpdec.c
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
24 * MLP decoder
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
25 */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
26
7199
ae8c047d6be5 Add required stdint.h header #include.
diego
parents: 7198
diff changeset
27 #include <stdint.h>
ae8c047d6be5 Add required stdint.h header #include.
diego
parents: 7198
diff changeset
28
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
29 #include "avcodec.h"
9585
5e1d9508b62f mlpdec: Move MLP's filter_channel() to dsputils.
ramiro
parents: 9567
diff changeset
30 #include "dsputil.h"
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
31 #include "libavutil/intreadwrite.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9355
diff changeset
32 #include "get_bits.h"
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
33 #include "libavutil/crc.h"
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
34 #include "parser.h"
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
35 #include "mlp_parser.h"
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
36 #include "mlp.h"
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
37
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
38 /** number of bits used for VLC lookup - longest Huffman code is 9 */
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
39 #define VLC_BITS 9
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
40
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
41
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
42 static const char* sample_message =
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
43 "Please file a bug report following the instructions at "
8460
5b3c90656fdf Change mplayerhq.hu references to ffmpeg.org where appropriate.
diego
parents: 8277
diff changeset
44 "http://ffmpeg.org/bugreports.html and include "
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
45 "a sample of this file.";
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
46
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
47 typedef struct SubStream {
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
48 //! Set if a valid restart header has been read. Otherwise the substream cannot be decoded.
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
49 uint8_t restart_seen;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
50
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
51 //@{
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
52 /** restart header data */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
53 //! The type of noise to be used in the rematrix stage.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
54 uint16_t noise_type;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
55
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
56 //! The index of the first channel coded in this substream.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
57 uint8_t min_channel;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
58 //! The index of the last channel coded in this substream.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
59 uint8_t max_channel;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
60 //! The number of channels input into the rematrix stage.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
61 uint8_t max_matrix_channel;
9203
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
62 //! For each channel output by the matrix, the output channel to map it to
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
63 uint8_t ch_assign[MAX_CHANNELS];
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
64
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
65 //! The left shift applied to random noise in 0x31ea substreams.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
66 uint8_t noise_shift;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
67 //! The current seed value for the pseudorandom noise generator(s).
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
68 uint32_t noisegen_seed;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
69
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
70 //! Set if the substream contains extra info to check the size of VLC blocks.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
71 uint8_t data_check_present;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
72
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
73 //! Bitmask of which parameter sets are conveyed in a decoding parameter block.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
74 uint8_t param_presence_flags;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
75 #define PARAM_BLOCKSIZE (1 << 7)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
76 #define PARAM_MATRIX (1 << 6)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
77 #define PARAM_OUTSHIFT (1 << 5)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
78 #define PARAM_QUANTSTEP (1 << 4)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
79 #define PARAM_FIR (1 << 3)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
80 #define PARAM_IIR (1 << 2)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
81 #define PARAM_HUFFOFFSET (1 << 1)
9202
42e9c5b34503 Support "next parameter flags present" flag.
ramiro
parents: 9201
diff changeset
82 #define PARAM_PRESENCE (1 << 0)
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
83 //@}
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
84
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
85 //@{
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
86 /** matrix data */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
87
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
88 //! Number of matrices to be applied.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
89 uint8_t num_primitive_matrices;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
90
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
91 //! matrix output channel
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
92 uint8_t matrix_out_ch[MAX_MATRICES];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
93
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
94 //! Whether the LSBs of the matrix output are encoded in the bitstream.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
95 uint8_t lsb_bypass[MAX_MATRICES];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
96 //! Matrix coefficients, stored as 2.14 fixed point.
9533
b724134599eb mlpdec: Don't overallocate buffers.
ramiro
parents: 9532
diff changeset
97 int32_t matrix_coeff[MAX_MATRICES][MAX_CHANNELS];
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
98 //! Left shift to apply to noise values in 0x31eb substreams.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
99 uint8_t matrix_noise_shift[MAX_MATRICES];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
100 //@}
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
101
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
102 //! Left shift to apply to Huffman-decoded residuals.
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
103 uint8_t quant_step_size[MAX_CHANNELS];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
104
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
105 //! number of PCM samples in current audio block
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
106 uint16_t blocksize;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
107 //! Number of PCM samples decoded so far in this frame.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
108 uint16_t blockpos;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
109
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
110 //! Left shift to apply to decoded PCM values to get final 24-bit output.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
111 int8_t output_shift[MAX_CHANNELS];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
112
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
113 //! Running XOR of all output samples.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
114 int32_t lossless_check_data;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
115
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
116 } SubStream;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
117
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
118 typedef struct MLPDecodeContext {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
119 AVCodecContext *avctx;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
120
9348
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
121 //! Current access unit being read has a major sync.
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
122 int is_major_sync_unit;
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
123
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
124 //! Set if a valid major sync block has been read. Otherwise no decoding is possible.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
125 uint8_t params_valid;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
126
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
127 //! Number of substreams contained within this stream.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
128 uint8_t num_substreams;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
129
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
130 //! Index of the last substream to decode - further substreams are skipped.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
131 uint8_t max_decoded_substream;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
132
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
133 //! number of PCM samples contained in each frame
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
134 int access_unit_size;
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
135 //! next power of two above the number of samples in each frame
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
136 int access_unit_size_pow2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
137
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
138 SubStream substream[MAX_SUBSTREAMS];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
139
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
140 ChannelParams channel_params[MAX_CHANNELS];
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
141
9350
1432fb0ee5d7 mlpdec: Filters and matrices may change only once per substream per access unit.
ramiro
parents: 9349
diff changeset
142 int matrix_changed;
1432fb0ee5d7 mlpdec: Filters and matrices may change only once per substream per access unit.
ramiro
parents: 9349
diff changeset
143 int filter_changed[MAX_CHANNELS][NUM_FILTERS];
1432fb0ee5d7 mlpdec: Filters and matrices may change only once per substream per access unit.
ramiro
parents: 9349
diff changeset
144
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
145 int8_t noise_buffer[MAX_BLOCKSIZE_POW2];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
146 int8_t bypassed_lsbs[MAX_BLOCKSIZE][MAX_CHANNELS];
9533
b724134599eb mlpdec: Don't overallocate buffers.
ramiro
parents: 9532
diff changeset
147 int32_t sample_buffer[MAX_BLOCKSIZE][MAX_CHANNELS];
9585
5e1d9508b62f mlpdec: Move MLP's filter_channel() to dsputils.
ramiro
parents: 9567
diff changeset
148
5e1d9508b62f mlpdec: Move MLP's filter_channel() to dsputils.
ramiro
parents: 9567
diff changeset
149 DSPContext dsp;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
150 } MLPDecodeContext;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
151
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
152 static VLC huff_vlc[3];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
153
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
154 /** Initialize static data, constant between all invocations of the codec. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
155
8693
18737839ed27 Add missing void keyword to parameterless function declarations.
diego
parents: 8460
diff changeset
156 static av_cold void init_static(void)
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
157 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
158 INIT_VLC_STATIC(&huff_vlc[0], VLC_BITS, 18,
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
159 &ff_mlp_huffman_tables[0][0][1], 2, 1,
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
160 &ff_mlp_huffman_tables[0][0][0], 2, 1, 512);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
161 INIT_VLC_STATIC(&huff_vlc[1], VLC_BITS, 16,
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
162 &ff_mlp_huffman_tables[1][0][1], 2, 1,
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
163 &ff_mlp_huffman_tables[1][0][0], 2, 1, 512);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
164 INIT_VLC_STATIC(&huff_vlc[2], VLC_BITS, 15,
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
165 &ff_mlp_huffman_tables[2][0][1], 2, 1,
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
166 &ff_mlp_huffman_tables[2][0][0], 2, 1, 512);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
167
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
168 ff_mlp_init_crc();
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
169 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
170
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
171 static inline int32_t calculate_sign_huff(MLPDecodeContext *m,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
172 unsigned int substr, unsigned int ch)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
173 {
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
174 ChannelParams *cp = &m->channel_params[ch];
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
175 SubStream *s = &m->substream[substr];
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
176 int lsb_bits = cp->huff_lsbs - s->quant_step_size[ch];
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
177 int sign_shift = lsb_bits + (cp->codebook ? 2 - cp->codebook : -1);
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
178 int32_t sign_huff_offset = cp->huff_offset;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
179
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
180 if (cp->codebook > 0)
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
181 sign_huff_offset -= 7 << lsb_bits;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
182
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
183 if (sign_shift >= 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
184 sign_huff_offset -= 1 << sign_shift;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
185
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
186 return sign_huff_offset;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
187 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
188
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
189 /** Read a sample, consisting of either, both or neither of entropy-coded MSBs
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
190 * and plain LSBs. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
191
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
192 static inline int read_huff_channels(MLPDecodeContext *m, GetBitContext *gbp,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
193 unsigned int substr, unsigned int pos)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
194 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
195 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
196 unsigned int mat, channel;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
197
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
198 for (mat = 0; mat < s->num_primitive_matrices; mat++)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
199 if (s->lsb_bypass[mat])
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
200 m->bypassed_lsbs[pos + s->blockpos][mat] = get_bits1(gbp);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
201
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
202 for (channel = s->min_channel; channel <= s->max_channel; channel++) {
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
203 ChannelParams *cp = &m->channel_params[channel];
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
204 int codebook = cp->codebook;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
205 int quant_step_size = s->quant_step_size[channel];
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
206 int lsb_bits = cp->huff_lsbs - quant_step_size;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
207 int result = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
208
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
209 if (codebook > 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
210 result = get_vlc2(gbp, huff_vlc[codebook-1].table,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
211 VLC_BITS, (9 + VLC_BITS - 1) / VLC_BITS);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
212
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
213 if (result < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
214 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
215
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
216 if (lsb_bits > 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
217 result = (result << lsb_bits) + get_bits(gbp, lsb_bits);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
218
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
219 result += cp->sign_huff_offset;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
220 result <<= quant_step_size;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
221
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
222 m->sample_buffer[pos + s->blockpos][channel] = result;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
223 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
224
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
225 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
226 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
227
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
228 static av_cold int mlp_decode_init(AVCodecContext *avctx)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
229 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
230 MLPDecodeContext *m = avctx->priv_data;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
231 int substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
232
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
233 init_static();
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
234 m->avctx = avctx;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
235 for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
236 m->substream[substr].lossless_check_data = 0xffffffff;
9585
5e1d9508b62f mlpdec: Move MLP's filter_channel() to dsputils.
ramiro
parents: 9567
diff changeset
237 dsputil_init(&m->dsp, avctx);
8276
9149588e5cc9 mlp: support bit-depths greater than 16 by default.
ramiro
parents: 8274
diff changeset
238
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
239 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
240 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
241
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
242 /** Read a major sync info header - contains high level information about
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
243 * the stream - sample rate, channel arrangement etc. Most of this
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
244 * information is not actually necessary for decoding, only for playback.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
245 */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
246
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
247 static int read_major_sync(MLPDecodeContext *m, GetBitContext *gb)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
248 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
249 MLPHeaderInfo mh;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
250 int substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
251
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
252 if (ff_mlp_read_major_sync(m->avctx, &mh, gb) != 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
253 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
254
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
255 if (mh.group1_bits == 0) {
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
256 av_log(m->avctx, AV_LOG_ERROR, "invalid/unknown bits per sample\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
257 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
258 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
259 if (mh.group2_bits > mh.group1_bits) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
260 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
261 "Channel group 2 cannot have more bits per sample than group 1.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
262 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
263 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
264
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
265 if (mh.group2_samplerate && mh.group2_samplerate != mh.group1_samplerate) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
266 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
267 "Channel groups with differing sample rates are not currently supported.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
268 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
269 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
270
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
271 if (mh.group1_samplerate == 0) {
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
272 av_log(m->avctx, AV_LOG_ERROR, "invalid/unknown sampling rate\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
273 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
274 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
275 if (mh.group1_samplerate > MAX_SAMPLERATE) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
276 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
277 "Sampling rate %d is greater than the supported maximum (%d).\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
278 mh.group1_samplerate, MAX_SAMPLERATE);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
279 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
280 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
281 if (mh.access_unit_size > MAX_BLOCKSIZE) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
282 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
283 "Block size %d is greater than the supported maximum (%d).\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
284 mh.access_unit_size, MAX_BLOCKSIZE);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
285 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
286 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
287 if (mh.access_unit_size_pow2 > MAX_BLOCKSIZE_POW2) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
288 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
289 "Block size pow2 %d is greater than the supported maximum (%d).\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
290 mh.access_unit_size_pow2, MAX_BLOCKSIZE_POW2);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
291 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
292 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
293
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
294 if (mh.num_substreams == 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
295 return -1;
9201
753780c4875e truehd: support up to 3 substreams.
ramiro
parents: 9190
diff changeset
296 if (m->avctx->codec_id == CODEC_ID_MLP && mh.num_substreams > 2) {
753780c4875e truehd: support up to 3 substreams.
ramiro
parents: 9190
diff changeset
297 av_log(m->avctx, AV_LOG_ERROR, "MLP only supports up to 2 substreams.\n");
753780c4875e truehd: support up to 3 substreams.
ramiro
parents: 9190
diff changeset
298 return -1;
753780c4875e truehd: support up to 3 substreams.
ramiro
parents: 9190
diff changeset
299 }
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
300 if (mh.num_substreams > MAX_SUBSTREAMS) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
301 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
302 "Number of substreams %d is larger than the maximum supported "
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
303 "by the decoder. %s\n", mh.num_substreams, sample_message);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
304 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
305 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
306
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
307 m->access_unit_size = mh.access_unit_size;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
308 m->access_unit_size_pow2 = mh.access_unit_size_pow2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
309
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
310 m->num_substreams = mh.num_substreams;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
311 m->max_decoded_substream = m->num_substreams - 1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
312
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
313 m->avctx->sample_rate = mh.group1_samplerate;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
314 m->avctx->frame_size = mh.access_unit_size;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
315
8274
82dbfe8d2e0b mlp: Fix compilation under CONFIG_AUDIO_NONSHORT.
ramiro
parents: 7575
diff changeset
316 m->avctx->bits_per_raw_sample = mh.group1_bits;
8277
a793f9afd5cb mlp: cosmetics: remove {}s over one-lined if.
ramiro
parents: 8276
diff changeset
317 if (mh.group1_bits > 16)
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
318 m->avctx->sample_fmt = SAMPLE_FMT_S32;
8276
9149588e5cc9 mlp: support bit-depths greater than 16 by default.
ramiro
parents: 8274
diff changeset
319 else
9149588e5cc9 mlp: support bit-depths greater than 16 by default.
ramiro
parents: 8274
diff changeset
320 m->avctx->sample_fmt = SAMPLE_FMT_S16;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
321
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
322 m->params_valid = 1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
323 for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
324 m->substream[substr].restart_seen = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
325
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
326 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
327 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
328
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
329 /** Read a restart header from a block in a substream. This contains parameters
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
330 * required to decode the audio that do not change very often. Generally
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
331 * (always) present only in blocks following a major sync. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
332
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
333 static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
334 const uint8_t *buf, unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
335 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
336 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
337 unsigned int ch;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
338 int sync_word, tmp;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
339 uint8_t checksum;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
340 uint8_t lossless_check;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
341 int start_count = get_bits_count(gbp);
9531
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
342 const int max_matrix_channel = m->avctx->codec_id == CODEC_ID_MLP
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
343 ? MAX_MATRIX_CHANNEL_MLP
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
344 : MAX_MATRIX_CHANNEL_TRUEHD;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
345
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
346 sync_word = get_bits(gbp, 13);
9613
56f0a4054770 mlpdec: Split sync word error and MLP sync word check.
ramiro
parents: 9612
diff changeset
347
56f0a4054770 mlpdec: Split sync word error and MLP sync word check.
ramiro
parents: 9612
diff changeset
348 if (sync_word != 0x31ea >> 1) {
56f0a4054770 mlpdec: Split sync word error and MLP sync word check.
ramiro
parents: 9612
diff changeset
349 av_log(m->avctx, AV_LOG_ERROR,
56f0a4054770 mlpdec: Split sync word error and MLP sync word check.
ramiro
parents: 9612
diff changeset
350 "restart header sync incorrect (got 0x%04x)\n", sync_word);
56f0a4054770 mlpdec: Split sync word error and MLP sync word check.
ramiro
parents: 9612
diff changeset
351 return -1;
56f0a4054770 mlpdec: Split sync word error and MLP sync word check.
ramiro
parents: 9612
diff changeset
352 }
56f0a4054770 mlpdec: Split sync word error and MLP sync word check.
ramiro
parents: 9612
diff changeset
353
9530
dbb16aa52d43 mlpdec: Restart header sync must be 0x31ea for MLP.
ramiro
parents: 9508
diff changeset
354 s->noise_type = get_bits1(gbp);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
355
9613
56f0a4054770 mlpdec: Split sync word error and MLP sync word check.
ramiro
parents: 9612
diff changeset
356 if (m->avctx->codec_id == CODEC_ID_MLP && s->noise_type) {
56f0a4054770 mlpdec: Split sync word error and MLP sync word check.
ramiro
parents: 9612
diff changeset
357 av_log(m->avctx, AV_LOG_ERROR, "MLP must have 0x31ea sync word.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
358 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
359 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
360
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
361 skip_bits(gbp, 16); /* Output timestamp */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
362
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
363 s->min_channel = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
364 s->max_channel = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
365 s->max_matrix_channel = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
366
9531
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
367 if (s->max_matrix_channel > max_matrix_channel) {
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
368 av_log(m->avctx, AV_LOG_ERROR,
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
369 "Max matrix channel cannot be greater than %d.\n",
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
370 max_matrix_channel);
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
371 return -1;
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
372 }
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
373
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
374 if (s->max_channel != s->max_matrix_channel) {
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
375 av_log(m->avctx, AV_LOG_ERROR,
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
376 "Max channel must be equal max matrix channel.\n");
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
377 return -1;
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
378 }
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9530
diff changeset
379
9614
2d9e7d5cd89b mlpdec: Fix possible writing out of array bounds introduced by being
ramiro
parents: 9613
diff changeset
380 /* This should happen for TrueHD streams with >6 channels and MLP's noise
2d9e7d5cd89b mlpdec: Fix possible writing out of array bounds introduced by being
ramiro
parents: 9613
diff changeset
381 * type. It is not yet known if this is allowed. */
2d9e7d5cd89b mlpdec: Fix possible writing out of array bounds introduced by being
ramiro
parents: 9613
diff changeset
382 if (s->max_channel > MAX_MATRIX_CHANNEL_MLP && !s->noise_type) {
2d9e7d5cd89b mlpdec: Fix possible writing out of array bounds introduced by being
ramiro
parents: 9613
diff changeset
383 av_log(m->avctx, AV_LOG_ERROR,
2d9e7d5cd89b mlpdec: Fix possible writing out of array bounds introduced by being
ramiro
parents: 9613
diff changeset
384 "Number of channels %d is larger than the maximum supported "
2d9e7d5cd89b mlpdec: Fix possible writing out of array bounds introduced by being
ramiro
parents: 9613
diff changeset
385 "by the decoder. %s\n", s->max_channel+2, sample_message);
2d9e7d5cd89b mlpdec: Fix possible writing out of array bounds introduced by being
ramiro
parents: 9613
diff changeset
386 return -1;
2d9e7d5cd89b mlpdec: Fix possible writing out of array bounds introduced by being
ramiro
parents: 9613
diff changeset
387 }
2d9e7d5cd89b mlpdec: Fix possible writing out of array bounds introduced by being
ramiro
parents: 9613
diff changeset
388
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
389 if (s->min_channel > s->max_channel) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
390 av_log(m->avctx, AV_LOG_ERROR,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
391 "Substream min channel cannot be greater than max channel.\n");
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
392 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
393 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
394
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
395 if (m->avctx->request_channels > 0
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
396 && s->max_channel + 1 >= m->avctx->request_channels
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
397 && substr < m->max_decoded_substream) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
398 av_log(m->avctx, AV_LOG_INFO,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
399 "Extracting %d channel downmix from substream %d. "
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
400 "Further substreams will be skipped.\n",
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
401 s->max_channel + 1, substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
402 m->max_decoded_substream = substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
403 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
404
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
405 s->noise_shift = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
406 s->noisegen_seed = get_bits(gbp, 23);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
407
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
408 skip_bits(gbp, 19);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
409
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
410 s->data_check_present = get_bits1(gbp);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
411 lossless_check = get_bits(gbp, 8);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
412 if (substr == m->max_decoded_substream
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
413 && s->lossless_check_data != 0xffffffff) {
7566
d112b4655bbd mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents: 7559
diff changeset
414 tmp = xor_32_to_8(s->lossless_check_data);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
415 if (tmp != lossless_check)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
416 av_log(m->avctx, AV_LOG_WARNING,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
417 "Lossless check failed - expected %02x, calculated %02x.\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
418 lossless_check, tmp);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
419 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
420
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
421 skip_bits(gbp, 16);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
422
9203
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
423 memset(s->ch_assign, 0, sizeof(s->ch_assign));
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
424
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
425 for (ch = 0; ch <= s->max_matrix_channel; ch++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
426 int ch_assign = get_bits(gbp, 6);
9203
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
427 if (ch_assign > s->max_matrix_channel) {
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
428 av_log(m->avctx, AV_LOG_ERROR,
9203
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
429 "Assignment of matrix channel %d to invalid output channel %d. %s\n",
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
430 ch, ch_assign, sample_message);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
431 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
432 }
9203
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
433 s->ch_assign[ch_assign] = ch;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
434 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
435
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
436 checksum = ff_mlp_restart_checksum(buf, get_bits_count(gbp) - start_count);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
437
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
438 if (checksum != get_bits(gbp, 8))
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
439 av_log(m->avctx, AV_LOG_ERROR, "restart header checksum error\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
440
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
441 /* Set default decoding parameters. */
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
442 s->param_presence_flags = 0xff;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
443 s->num_primitive_matrices = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
444 s->blocksize = 8;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
445 s->lossless_check_data = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
446
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
447 memset(s->output_shift , 0, sizeof(s->output_shift ));
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
448 memset(s->quant_step_size, 0, sizeof(s->quant_step_size));
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
449
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
450 for (ch = s->min_channel; ch <= s->max_channel; ch++) {
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
451 ChannelParams *cp = &m->channel_params[ch];
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
452 cp->filter_params[FIR].order = 0;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
453 cp->filter_params[IIR].order = 0;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
454 cp->filter_params[FIR].shift = 0;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
455 cp->filter_params[IIR].shift = 0;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
456
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
457 /* Default audio coding is 24-bit raw PCM. */
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
458 cp->huff_offset = 0;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
459 cp->sign_huff_offset = (-1) << 23;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
460 cp->codebook = 0;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
461 cp->huff_lsbs = 24;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
462 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
463
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
464 if (substr == m->max_decoded_substream)
9203
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
465 m->avctx->channels = s->max_matrix_channel + 1;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
466
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
467 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
468 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
469
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
470 /** Read parameters for one of the prediction filters. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
471
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
472 static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
473 unsigned int channel, unsigned int filter)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
474 {
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
475 FilterParams *fp = &m->channel_params[channel].filter_params[filter];
9278
41e285948ffc mlpdec: Max filter orders for FIR and IIR are 8 and 4 respectively.
ramiro
parents: 9268
diff changeset
476 const int max_order = filter ? MAX_IIR_ORDER : MAX_FIR_ORDER;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
477 const char fchar = filter ? 'I' : 'F';
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
478 int i, order;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
479
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
480 // Filter is 0 for FIR, 1 for IIR.
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
481 assert(filter < 2);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
482
9503
1997b5b2a40e mlpdec: Check for {matrix,filter}_changed as soon as they are incremented.
ramiro
parents: 9428
diff changeset
483 if (m->filter_changed[channel][filter]++ > 1) {
1997b5b2a40e mlpdec: Check for {matrix,filter}_changed as soon as they are incremented.
ramiro
parents: 9428
diff changeset
484 av_log(m->avctx, AV_LOG_ERROR, "Filters may change only once per access unit.\n");
1997b5b2a40e mlpdec: Check for {matrix,filter}_changed as soon as they are incremented.
ramiro
parents: 9428
diff changeset
485 return -1;
1997b5b2a40e mlpdec: Check for {matrix,filter}_changed as soon as they are incremented.
ramiro
parents: 9428
diff changeset
486 }
9350
1432fb0ee5d7 mlpdec: Filters and matrices may change only once per substream per access unit.
ramiro
parents: 9349
diff changeset
487
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
488 order = get_bits(gbp, 4);
9278
41e285948ffc mlpdec: Max filter orders for FIR and IIR are 8 and 4 respectively.
ramiro
parents: 9268
diff changeset
489 if (order > max_order) {
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
490 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
491 "%cIR filter order %d is greater than maximum %d.\n",
9278
41e285948ffc mlpdec: Max filter orders for FIR and IIR are 8 and 4 respectively.
ramiro
parents: 9268
diff changeset
492 fchar, order, max_order);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
493 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
494 }
7552
88ffd7c9c0ed mlpdec: Split filter parameters from context into their own struct.
ramiro
parents: 7451
diff changeset
495 fp->order = order;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
496
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
497 if (order > 0) {
9647
d0fe5dc427f0 mlp: Simplify adressing of state and coeffs arrays for both filters by making
ramiro
parents: 9614
diff changeset
498 int32_t *fcoeff = m->channel_params[channel].coeff[filter];
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
499 int coeff_bits, coeff_shift;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
500
7552
88ffd7c9c0ed mlpdec: Split filter parameters from context into their own struct.
ramiro
parents: 7451
diff changeset
501 fp->shift = get_bits(gbp, 4);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
502
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
503 coeff_bits = get_bits(gbp, 5);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
504 coeff_shift = get_bits(gbp, 3);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
505 if (coeff_bits < 1 || coeff_bits > 16) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
506 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
507 "%cIR filter coeff_bits must be between 1 and 16.\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
508 fchar);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
509 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
510 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
511 if (coeff_bits + coeff_shift > 16) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
512 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
513 "Sum of coeff_bits and coeff_shift for %cIR filter must be 16 or less.\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
514 fchar);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
515 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
516 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
517
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
518 for (i = 0; i < order; i++)
9647
d0fe5dc427f0 mlp: Simplify adressing of state and coeffs arrays for both filters by making
ramiro
parents: 9614
diff changeset
519 fcoeff[i] = get_sbits(gbp, coeff_bits) << coeff_shift;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
520
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
521 if (get_bits1(gbp)) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
522 int state_bits, state_shift;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
523
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
524 if (filter == FIR) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
525 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
526 "FIR filter has state data specified.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
527 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
528 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
529
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
530 state_bits = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
531 state_shift = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
532
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
533 /* TODO: Check validity of state data. */
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
534
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
535 for (i = 0; i < order; i++)
7553
b5f8d814a206 mlpdec: whitespace and line-breaking cosmetics.
ramiro
parents: 7552
diff changeset
536 fp->state[i] = get_sbits(gbp, state_bits) << state_shift;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
537 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
538 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
539
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
540 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
541 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
542
9262
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
543 /** Read parameters for primitive matrices. */
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
544
9504
dc643c3c285e mlpdec: Make read_matrix_params() take unsigned int substr for consistency.
ramiro
parents: 9503
diff changeset
545 static int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitContext *gbp)
9262
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
546 {
9504
dc643c3c285e mlpdec: Make read_matrix_params() take unsigned int substr for consistency.
ramiro
parents: 9503
diff changeset
547 SubStream *s = &m->substream[substr];
9262
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
548 unsigned int mat, ch;
9532
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
549 const int max_primitive_matrices = m->avctx->codec_id == CODEC_ID_MLP
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
550 ? MAX_MATRICES_MLP
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
551 : MAX_MATRICES_TRUEHD;
9262
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
552
9503
1997b5b2a40e mlpdec: Check for {matrix,filter}_changed as soon as they are incremented.
ramiro
parents: 9428
diff changeset
553 if (m->matrix_changed++ > 1) {
1997b5b2a40e mlpdec: Check for {matrix,filter}_changed as soon as they are incremented.
ramiro
parents: 9428
diff changeset
554 av_log(m->avctx, AV_LOG_ERROR, "Matrices may change only once per access unit.\n");
1997b5b2a40e mlpdec: Check for {matrix,filter}_changed as soon as they are incremented.
ramiro
parents: 9428
diff changeset
555 return -1;
1997b5b2a40e mlpdec: Check for {matrix,filter}_changed as soon as they are incremented.
ramiro
parents: 9428
diff changeset
556 }
1997b5b2a40e mlpdec: Check for {matrix,filter}_changed as soon as they are incremented.
ramiro
parents: 9428
diff changeset
557
9262
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
558 s->num_primitive_matrices = get_bits(gbp, 4);
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
559
9532
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
560 if (s->num_primitive_matrices > max_primitive_matrices) {
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
561 av_log(m->avctx, AV_LOG_ERROR,
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
562 "Number of primitive matrices cannot be greater than %d.\n",
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
563 max_primitive_matrices);
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
564 return -1;
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
565 }
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
566
9262
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
567 for (mat = 0; mat < s->num_primitive_matrices; mat++) {
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
568 int frac_bits, max_chan;
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
569 s->matrix_out_ch[mat] = get_bits(gbp, 4);
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
570 frac_bits = get_bits(gbp, 4);
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
571 s->lsb_bypass [mat] = get_bits1(gbp);
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
572
9347
b799c2a83624 mlpdec: matrix_out_ch must not be greater than max_matrix_channel, and not max_channel.
ramiro
parents: 9288
diff changeset
573 if (s->matrix_out_ch[mat] > s->max_matrix_channel) {
9262
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
574 av_log(m->avctx, AV_LOG_ERROR,
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
575 "Invalid channel %d specified as output from matrix.\n",
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
576 s->matrix_out_ch[mat]);
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
577 return -1;
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
578 }
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
579 if (frac_bits > 14) {
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
580 av_log(m->avctx, AV_LOG_ERROR,
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
581 "Too many fractional bits specified.\n");
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
582 return -1;
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
583 }
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
584
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
585 max_chan = s->max_matrix_channel;
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
586 if (!s->noise_type)
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
587 max_chan+=2;
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
588
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
589 for (ch = 0; ch <= max_chan; ch++) {
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
590 int coeff_val = 0;
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
591 if (get_bits1(gbp))
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
592 coeff_val = get_sbits(gbp, frac_bits + 2);
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
593
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
594 s->matrix_coeff[mat][ch] = coeff_val << (14 - frac_bits);
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
595 }
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
596
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
597 if (s->noise_type)
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
598 s->matrix_noise_shift[mat] = get_bits(gbp, 4);
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
599 else
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
600 s->matrix_noise_shift[mat] = 0;
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
601 }
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
602
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
603 return 0;
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
604 }
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
605
9263
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
606 /** Read channel parameters. */
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
607
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
608 static int read_channel_params(MLPDecodeContext *m, unsigned int substr,
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
609 GetBitContext *gbp, unsigned int ch)
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
610 {
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
611 ChannelParams *cp = &m->channel_params[ch];
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
612 FilterParams *fir = &cp->filter_params[FIR];
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
613 FilterParams *iir = &cp->filter_params[IIR];
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
614 SubStream *s = &m->substream[substr];
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
615
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
616 if (s->param_presence_flags & PARAM_FIR)
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
617 if (get_bits1(gbp))
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
618 if (read_filter_params(m, gbp, ch, FIR) < 0)
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
619 return -1;
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
620
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
621 if (s->param_presence_flags & PARAM_IIR)
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
622 if (get_bits1(gbp))
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
623 if (read_filter_params(m, gbp, ch, IIR) < 0)
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
624 return -1;
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
625
9283
a37db17a8283 mlpdec: More validation for read_channel_params()
ramiro
parents: 9282
diff changeset
626 if (fir->order + iir->order > 8) {
a37db17a8283 mlpdec: More validation for read_channel_params()
ramiro
parents: 9282
diff changeset
627 av_log(m->avctx, AV_LOG_ERROR, "Total filter orders too high.\n");
a37db17a8283 mlpdec: More validation for read_channel_params()
ramiro
parents: 9282
diff changeset
628 return -1;
a37db17a8283 mlpdec: More validation for read_channel_params()
ramiro
parents: 9282
diff changeset
629 }
a37db17a8283 mlpdec: More validation for read_channel_params()
ramiro
parents: 9282
diff changeset
630
9263
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
631 if (fir->order && iir->order &&
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
632 fir->shift != iir->shift) {
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
633 av_log(m->avctx, AV_LOG_ERROR,
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
634 "FIR and IIR filters must use the same precision.\n");
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
635 return -1;
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
636 }
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
637 /* The FIR and IIR filters must have the same precision.
9612
de33a215fd84 mlpdec: Fix indentation that got mangled from copy&paste.
ramiro
parents: 9585
diff changeset
638 * To simplify the filtering code, only the precision of the
de33a215fd84 mlpdec: Fix indentation that got mangled from copy&paste.
ramiro
parents: 9585
diff changeset
639 * FIR filter is considered. If only the IIR filter is employed,
de33a215fd84 mlpdec: Fix indentation that got mangled from copy&paste.
ramiro
parents: 9585
diff changeset
640 * the FIR filter precision is set to that of the IIR filter, so
de33a215fd84 mlpdec: Fix indentation that got mangled from copy&paste.
ramiro
parents: 9585
diff changeset
641 * that the filtering code can use it. */
9263
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
642 if (!fir->order && iir->order)
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
643 fir->shift = iir->shift;
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
644
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
645 if (s->param_presence_flags & PARAM_HUFFOFFSET)
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
646 if (get_bits1(gbp))
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
647 cp->huff_offset = get_sbits(gbp, 15);
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
648
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
649 cp->codebook = get_bits(gbp, 2);
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
650 cp->huff_lsbs = get_bits(gbp, 5);
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
651
9283
a37db17a8283 mlpdec: More validation for read_channel_params()
ramiro
parents: 9282
diff changeset
652 if (cp->huff_lsbs > 24) {
a37db17a8283 mlpdec: More validation for read_channel_params()
ramiro
parents: 9282
diff changeset
653 av_log(m->avctx, AV_LOG_ERROR, "Invalid huff_lsbs.\n");
a37db17a8283 mlpdec: More validation for read_channel_params()
ramiro
parents: 9282
diff changeset
654 return -1;
a37db17a8283 mlpdec: More validation for read_channel_params()
ramiro
parents: 9282
diff changeset
655 }
9263
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
656
9283
a37db17a8283 mlpdec: More validation for read_channel_params()
ramiro
parents: 9282
diff changeset
657 cp->sign_huff_offset = calculate_sign_huff(m, substr, ch);
9263
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
658
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
659 return 0;
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
660 }
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
661
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
662 /** Read decoding parameters that change more often than those in the restart
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
663 * header. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
664
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
665 static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
666 unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
667 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
668 SubStream *s = &m->substream[substr];
9262
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
669 unsigned int ch;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
670
9202
42e9c5b34503 Support "next parameter flags present" flag.
ramiro
parents: 9201
diff changeset
671 if (s->param_presence_flags & PARAM_PRESENCE)
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
672 if (get_bits1(gbp))
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
673 s->param_presence_flags = get_bits(gbp, 8);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
674
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
675 if (s->param_presence_flags & PARAM_BLOCKSIZE)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
676 if (get_bits1(gbp)) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
677 s->blocksize = get_bits(gbp, 9);
9267
ca630efd0a96 mlpdec: Check for blocksize in proper range.
ramiro
parents: 9266
diff changeset
678 if (s->blocksize < 8 || s->blocksize > m->access_unit_size) {
ca630efd0a96 mlpdec: Check for blocksize in proper range.
ramiro
parents: 9266
diff changeset
679 av_log(m->avctx, AV_LOG_ERROR, "Invalid blocksize.");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
680 s->blocksize = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
681 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
682 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
683 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
684
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
685 if (s->param_presence_flags & PARAM_MATRIX)
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
686 if (get_bits1(gbp))
9504
dc643c3c285e mlpdec: Make read_matrix_params() take unsigned int substr for consistency.
ramiro
parents: 9503
diff changeset
687 if (read_matrix_params(m, substr, gbp) < 0)
9262
3c9a424163ee mlpdec: Split read_matrix_params() into its own function.
ramiro
parents: 9203
diff changeset
688 return -1;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
689
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
690 if (s->param_presence_flags & PARAM_OUTSHIFT)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
691 if (get_bits1(gbp))
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
692 for (ch = 0; ch <= s->max_matrix_channel; ch++)
9264
230dac9ec1d4 mlpdec: output_shift is signed
ramiro
parents: 9263
diff changeset
693 s->output_shift[ch] = get_sbits(gbp, 4);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
694
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
695 if (s->param_presence_flags & PARAM_QUANTSTEP)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
696 if (get_bits1(gbp))
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
697 for (ch = 0; ch <= s->max_channel; ch++) {
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
698 ChannelParams *cp = &m->channel_params[ch];
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
699
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
700 s->quant_step_size[ch] = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
701
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
702 cp->sign_huff_offset = calculate_sign_huff(m, substr, ch);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
703 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
704
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
705 for (ch = s->min_channel; ch <= s->max_channel; ch++)
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
706 if (get_bits1(gbp))
9263
62774b28cde0 mlpdec: Split read_channel_params() into its own function.
ramiro
parents: 9262
diff changeset
707 if (read_channel_params(m, substr, gbp, ch) < 0)
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
708 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
709
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
710 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
711 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
712
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
713 #define MSB_MASK(bits) (-1u << bits)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
714
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
715 /** Generate PCM samples using the prediction filters and residual values
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
716 * read from the data stream, and update the filter state. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
717
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
718 static void filter_channel(MLPDecodeContext *m, unsigned int substr,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
719 unsigned int channel)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
720 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
721 SubStream *s = &m->substream[substr];
9647
d0fe5dc427f0 mlp: Simplify adressing of state and coeffs arrays for both filters by making
ramiro
parents: 9614
diff changeset
722 const int32_t *fircoeff = m->channel_params[channel].coeff[FIR];
d0fe5dc427f0 mlp: Simplify adressing of state and coeffs arrays for both filters by making
ramiro
parents: 9614
diff changeset
723 int32_t state_buffer[NUM_FILTERS][MAX_BLOCKSIZE + MAX_FIR_ORDER];
d0fe5dc427f0 mlp: Simplify adressing of state and coeffs arrays for both filters by making
ramiro
parents: 9614
diff changeset
724 int32_t *firbuf = state_buffer[FIR] + MAX_BLOCKSIZE;
d0fe5dc427f0 mlp: Simplify adressing of state and coeffs arrays for both filters by making
ramiro
parents: 9614
diff changeset
725 int32_t *iirbuf = state_buffer[IIR] + MAX_BLOCKSIZE;
9280
e3eff8a463ec mlpdec: Split filter_state_buffer into [fi]irbuf and fp to [fi]ir.
ramiro
parents: 9279
diff changeset
726 FilterParams *fir = &m->channel_params[channel].filter_params[FIR];
e3eff8a463ec mlpdec: Split filter_state_buffer into [fi]irbuf and fp to [fi]ir.
ramiro
parents: 9279
diff changeset
727 FilterParams *iir = &m->channel_params[channel].filter_params[IIR];
e3eff8a463ec mlpdec: Split filter_state_buffer into [fi]irbuf and fp to [fi]ir.
ramiro
parents: 9279
diff changeset
728 unsigned int filter_shift = fir->shift;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
729 int32_t mask = MSB_MASK(s->quant_step_size[channel]);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
730
9567
d98ad4678fb0 mlpdec: Simplify filtering code by using only one counter variable.
ramiro
parents: 9533
diff changeset
731 memcpy(firbuf, fir->state, MAX_FIR_ORDER * sizeof(int32_t));
d98ad4678fb0 mlpdec: Simplify filtering code by using only one counter variable.
ramiro
parents: 9533
diff changeset
732 memcpy(iirbuf, iir->state, MAX_IIR_ORDER * sizeof(int32_t));
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
733
9647
d0fe5dc427f0 mlp: Simplify adressing of state and coeffs arrays for both filters by making
ramiro
parents: 9614
diff changeset
734 m->dsp.mlp_filter_channel(firbuf, fircoeff,
d0fe5dc427f0 mlp: Simplify adressing of state and coeffs arrays for both filters by making
ramiro
parents: 9614
diff changeset
735 fir->order, iir->order,
9585
5e1d9508b62f mlpdec: Move MLP's filter_channel() to dsputils.
ramiro
parents: 9567
diff changeset
736 filter_shift, mask, s->blocksize,
5e1d9508b62f mlpdec: Move MLP's filter_channel() to dsputils.
ramiro
parents: 9567
diff changeset
737 &m->sample_buffer[s->blockpos][channel]);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
738
9585
5e1d9508b62f mlpdec: Move MLP's filter_channel() to dsputils.
ramiro
parents: 9567
diff changeset
739 memcpy(fir->state, firbuf - s->blocksize, MAX_FIR_ORDER * sizeof(int32_t));
5e1d9508b62f mlpdec: Move MLP's filter_channel() to dsputils.
ramiro
parents: 9567
diff changeset
740 memcpy(iir->state, iirbuf - s->blocksize, MAX_IIR_ORDER * sizeof(int32_t));
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
741 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
742
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
743 /** Read a block of PCM residual data (or actual if no filtering active). */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
744
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
745 static int read_block_data(MLPDecodeContext *m, GetBitContext *gbp,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
746 unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
747 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
748 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
749 unsigned int i, ch, expected_stream_pos = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
750
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
751 if (s->data_check_present) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
752 expected_stream_pos = get_bits_count(gbp);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
753 expected_stream_pos += get_bits(gbp, 16);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
754 av_log(m->avctx, AV_LOG_WARNING, "This file contains some features "
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
755 "we have not tested yet. %s\n", sample_message);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
756 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
757
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
758 if (s->blockpos + s->blocksize > m->access_unit_size) {
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
759 av_log(m->avctx, AV_LOG_ERROR, "too many audio samples in frame\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
760 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
761 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
762
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
763 memset(&m->bypassed_lsbs[s->blockpos][0], 0,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
764 s->blocksize * sizeof(m->bypassed_lsbs[0]));
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
765
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
766 for (i = 0; i < s->blocksize; i++)
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
767 if (read_huff_channels(m, gbp, substr, i) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
768 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
769
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
770 for (ch = s->min_channel; ch <= s->max_channel; ch++)
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
771 filter_channel(m, substr, ch);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
772
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
773 s->blockpos += s->blocksize;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
774
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
775 if (s->data_check_present) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
776 if (get_bits_count(gbp) != expected_stream_pos)
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
777 av_log(m->avctx, AV_LOG_ERROR, "block data length mismatch\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
778 skip_bits(gbp, 8);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
779 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
780
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
781 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
782 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
783
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
784 /** Data table used for TrueHD noise generation function. */
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
785
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
786 static const int8_t noise_table[256] = {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
787 30, 51, 22, 54, 3, 7, -4, 38, 14, 55, 46, 81, 22, 58, -3, 2,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
788 52, 31, -7, 51, 15, 44, 74, 30, 85, -17, 10, 33, 18, 80, 28, 62,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
789 10, 32, 23, 69, 72, 26, 35, 17, 73, 60, 8, 56, 2, 6, -2, -5,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
790 51, 4, 11, 50, 66, 76, 21, 44, 33, 47, 1, 26, 64, 48, 57, 40,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
791 38, 16, -10, -28, 92, 22, -18, 29, -10, 5, -13, 49, 19, 24, 70, 34,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
792 61, 48, 30, 14, -6, 25, 58, 33, 42, 60, 67, 17, 54, 17, 22, 30,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
793 67, 44, -9, 50, -11, 43, 40, 32, 59, 82, 13, 49, -14, 55, 60, 36,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
794 48, 49, 31, 47, 15, 12, 4, 65, 1, 23, 29, 39, 45, -2, 84, 69,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
795 0, 72, 37, 57, 27, 41, -15, -16, 35, 31, 14, 61, 24, 0, 27, 24,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
796 16, 41, 55, 34, 53, 9, 56, 12, 25, 29, 53, 5, 20, -20, -8, 20,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
797 13, 28, -3, 78, 38, 16, 11, 62, 46, 29, 21, 24, 46, 65, 43, -23,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
798 89, 18, 74, 21, 38, -12, 19, 12, -19, 8, 15, 33, 4, 57, 9, -8,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
799 36, 35, 26, 28, 7, 83, 63, 79, 75, 11, 3, 87, 37, 47, 34, 40,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
800 39, 19, 20, 42, 27, 34, 39, 77, 13, 42, 59, 64, 45, -1, 32, 37,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
801 45, -5, 53, -6, 7, 36, 50, 23, 6, 32, 9, -21, 18, 71, 27, 52,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
802 -25, 31, 35, 42, -1, 68, 63, 52, 26, 43, 66, 37, 41, 25, 40, 70,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
803 };
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
804
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
805 /** Noise generation functions.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
806 * I'm not sure what these are for - they seem to be some kind of pseudorandom
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
807 * sequence generators, used to generate noise data which is used when the
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
808 * channels are rematrixed. I'm not sure if they provide a practical benefit
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
809 * to compression, or just obfuscate the decoder. Are they for some kind of
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
810 * dithering? */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
811
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
812 /** Generate two channels of noise, used in the matrix when
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
813 * restart sync word == 0x31ea. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
814
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
815 static void generate_2_noise_channels(MLPDecodeContext *m, unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
816 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
817 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
818 unsigned int i;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
819 uint32_t seed = s->noisegen_seed;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
820 unsigned int maxchan = s->max_matrix_channel;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
821
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
822 for (i = 0; i < s->blockpos; i++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
823 uint16_t seed_shr7 = seed >> 7;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
824 m->sample_buffer[i][maxchan+1] = ((int8_t)(seed >> 15)) << s->noise_shift;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
825 m->sample_buffer[i][maxchan+2] = ((int8_t) seed_shr7) << s->noise_shift;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
826
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
827 seed = (seed << 16) ^ seed_shr7 ^ (seed_shr7 << 5);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
828 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
829
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
830 s->noisegen_seed = seed;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
831 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
832
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
833 /** Generate a block of noise, used when restart sync word == 0x31eb. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
834
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
835 static void fill_noise_buffer(MLPDecodeContext *m, unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
836 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
837 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
838 unsigned int i;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
839 uint32_t seed = s->noisegen_seed;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
840
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
841 for (i = 0; i < m->access_unit_size_pow2; i++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
842 uint8_t seed_shr15 = seed >> 15;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
843 m->noise_buffer[i] = noise_table[seed_shr15];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
844 seed = (seed << 8) ^ seed_shr15 ^ (seed_shr15 << 5);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
845 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
846
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
847 s->noisegen_seed = seed;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
848 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
849
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
850
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
851 /** Apply the channel matrices in turn to reconstruct the original audio
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
852 * samples. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
853
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
854 static void rematrix_channels(MLPDecodeContext *m, unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
855 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
856 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
857 unsigned int mat, src_ch, i;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
858 unsigned int maxchan;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
859
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
860 maxchan = s->max_matrix_channel;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
861 if (!s->noise_type) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
862 generate_2_noise_channels(m, substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
863 maxchan += 2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
864 } else {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
865 fill_noise_buffer(m, substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
866 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
867
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
868 for (mat = 0; mat < s->num_primitive_matrices; mat++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
869 int matrix_noise_shift = s->matrix_noise_shift[mat];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
870 unsigned int dest_ch = s->matrix_out_ch[mat];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
871 int32_t mask = MSB_MASK(s->quant_step_size[dest_ch]);
9506
50feb15cbf2a mlpdec: Use some context arrays with local variables in rematrix_channels().
ramiro
parents: 9505
diff changeset
872 int32_t *coeffs = s->matrix_coeff[mat];
9505
bcef741a555a truehd: Simplify rematrix_channels() as per Michael's original review.
ramiro
parents: 9504
diff changeset
873 int index = s->num_primitive_matrices - mat;
bcef741a555a truehd: Simplify rematrix_channels() as per Michael's original review.
ramiro
parents: 9504
diff changeset
874 int index2 = 2 * index + 1;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
875
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
876 /* TODO: DSPContext? */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
877
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
878 for (i = 0; i < s->blockpos; i++) {
9508
41ab6db265d0 mlpdec: Read context variable to local variable to make code cleaner.
ramiro
parents: 9507
diff changeset
879 int32_t bypassed_lsb = m->bypassed_lsbs[i][mat];
9506
50feb15cbf2a mlpdec: Use some context arrays with local variables in rematrix_channels().
ramiro
parents: 9505
diff changeset
880 int32_t *samples = m->sample_buffer[i];
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
881 int64_t accum = 0;
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
882
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
883 for (src_ch = 0; src_ch <= maxchan; src_ch++)
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
884 accum += (int64_t) samples[src_ch] * coeffs[src_ch];
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
885
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
886 if (matrix_noise_shift) {
9505
bcef741a555a truehd: Simplify rematrix_channels() as per Michael's original review.
ramiro
parents: 9504
diff changeset
887 index &= m->access_unit_size_pow2 - 1;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
888 accum += m->noise_buffer[index] << (matrix_noise_shift + 7);
9505
bcef741a555a truehd: Simplify rematrix_channels() as per Michael's original review.
ramiro
parents: 9504
diff changeset
889 index += index2;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
890 }
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
891
9508
41ab6db265d0 mlpdec: Read context variable to local variable to make code cleaner.
ramiro
parents: 9507
diff changeset
892 samples[dest_ch] = ((accum >> 14) & mask) + bypassed_lsb;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
893 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
894 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
895 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
896
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
897 /** Write the audio data into the output buffer. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
898
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
899 static int output_data_internal(MLPDecodeContext *m, unsigned int substr,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
900 uint8_t *data, unsigned int *data_size, int is32)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
901 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
902 SubStream *s = &m->substream[substr];
9203
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
903 unsigned int i, out_ch = 0;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
904 int32_t *data_32 = (int32_t*) data;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
905 int16_t *data_16 = (int16_t*) data;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
906
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
907 if (*data_size < (s->max_channel + 1) * s->blockpos * (is32 ? 4 : 2))
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
908 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
909
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
910 for (i = 0; i < s->blockpos; i++) {
9203
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
911 for (out_ch = 0; out_ch <= s->max_matrix_channel; out_ch++) {
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
912 int mat_ch = s->ch_assign[out_ch];
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
913 int32_t sample = m->sample_buffer[i][mat_ch]
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
914 << s->output_shift[mat_ch];
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
915 s->lossless_check_data ^= (sample & 0xffffff) << mat_ch;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
916 if (is32) *data_32++ = sample << 8;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
917 else *data_16++ = sample >> 8;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
918 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
919 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
920
9203
5074e89eb15f mlp, truehd: support non 1:1 channel mapping.
ramiro
parents: 9202
diff changeset
921 *data_size = i * out_ch * (is32 ? 4 : 2);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
922
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
923 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
924 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
925
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
926 static int output_data(MLPDecodeContext *m, unsigned int substr,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
927 uint8_t *data, unsigned int *data_size)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
928 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
929 if (m->avctx->sample_fmt == SAMPLE_FMT_S32)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
930 return output_data_internal(m, substr, data, data_size, 1);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
931 else
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
932 return output_data_internal(m, substr, data, data_size, 0);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
933 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
934
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
935
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
936 /** Read an access unit from the stream.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
937 * Returns < 0 on error, 0 if not enough data is present in the input stream
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
938 * otherwise returns the number of bytes consumed. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
939
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
940 static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9350
diff changeset
941 AVPacket *avpkt)
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
942 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9350
diff changeset
943 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 9350
diff changeset
944 int buf_size = avpkt->size;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
945 MLPDecodeContext *m = avctx->priv_data;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
946 GetBitContext gb;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
947 unsigned int length, substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
948 unsigned int substream_start;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
949 unsigned int header_size = 4;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
950 unsigned int substr_header_size = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
951 uint8_t substream_parity_present[MAX_SUBSTREAMS];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
952 uint16_t substream_data_len[MAX_SUBSTREAMS];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
953 uint8_t parity_bits;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
954
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
955 if (buf_size < 4)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
956 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
957
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
958 length = (AV_RB16(buf) & 0xfff) * 2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
959
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
960 if (length > buf_size)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
961 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
962
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
963 init_get_bits(&gb, (buf + 4), (length - 4) * 8);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
964
9348
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
965 m->is_major_sync_unit = 0;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
966 if (show_bits_long(&gb, 31) == (0xf8726fba >> 1)) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
967 if (read_major_sync(m, &gb) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
968 goto error;
9348
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
969 m->is_major_sync_unit = 1;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
970 header_size += 28;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
971 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
972
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
973 if (!m->params_valid) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
974 av_log(m->avctx, AV_LOG_WARNING,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
975 "Stream parameters not seen; skipping frame.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
976 *data_size = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
977 return length;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
978 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
979
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
980 substream_start = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
981
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
982 for (substr = 0; substr < m->num_substreams; substr++) {
9348
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
983 int extraword_present, checkdata_present, end, nonrestart_substr;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
984
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
985 extraword_present = get_bits1(&gb);
9348
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
986 nonrestart_substr = get_bits1(&gb);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
987 checkdata_present = get_bits1(&gb);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
988 skip_bits1(&gb);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
989
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
990 end = get_bits(&gb, 12) * 2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
991
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
992 substr_header_size += 2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
993
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
994 if (extraword_present) {
9349
1a3bb292b65d mlpdec: There must be no extraword for MLP.
ramiro
parents: 9348
diff changeset
995 if (m->avctx->codec_id == CODEC_ID_MLP) {
1a3bb292b65d mlpdec: There must be no extraword for MLP.
ramiro
parents: 9348
diff changeset
996 av_log(m->avctx, AV_LOG_ERROR, "There must be no extraword for MLP.\n");
1a3bb292b65d mlpdec: There must be no extraword for MLP.
ramiro
parents: 9348
diff changeset
997 goto error;
1a3bb292b65d mlpdec: There must be no extraword for MLP.
ramiro
parents: 9348
diff changeset
998 }
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
999 skip_bits(&gb, 16);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1000 substr_header_size += 2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1001 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1002
9348
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
1003 if (!(nonrestart_substr ^ m->is_major_sync_unit)) {
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
1004 av_log(m->avctx, AV_LOG_ERROR, "Invalid nonrestart_substr.\n");
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
1005 goto error;
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
1006 }
586dca8c04e7 mlpdec: Validate non-restart bit from the substream header.
ramiro
parents: 9347
diff changeset
1007
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1008 if (end + header_size + substr_header_size > length) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1009 av_log(m->avctx, AV_LOG_ERROR,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1010 "Indicated length of substream %d data goes off end of "
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1011 "packet.\n", substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1012 end = length - header_size - substr_header_size;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1013 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1014
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1015 if (end < substream_start) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1016 av_log(avctx, AV_LOG_ERROR,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1017 "Indicated end offset of substream %d data "
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1018 "is smaller than calculated start offset.\n",
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1019 substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1020 goto error;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1021 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1022
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1023 if (substr > m->max_decoded_substream)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1024 continue;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1025
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1026 substream_parity_present[substr] = checkdata_present;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1027 substream_data_len[substr] = end - substream_start;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1028 substream_start = end;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1029 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1030
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
1031 parity_bits = ff_mlp_calculate_parity(buf, 4);
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
1032 parity_bits ^= ff_mlp_calculate_parity(buf + header_size, substr_header_size);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1033
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1034 if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1035 av_log(avctx, AV_LOG_ERROR, "Parity check failed.\n");
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1036 goto error;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1037 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1038
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1039 buf += header_size + substr_header_size;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1040
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1041 for (substr = 0; substr <= m->max_decoded_substream; substr++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1042 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1043 init_get_bits(&gb, buf, substream_data_len[substr] * 8);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1044
9350
1432fb0ee5d7 mlpdec: Filters and matrices may change only once per substream per access unit.
ramiro
parents: 9349
diff changeset
1045 m->matrix_changed = 0;
1432fb0ee5d7 mlpdec: Filters and matrices may change only once per substream per access unit.
ramiro
parents: 9349
diff changeset
1046 memset(m->filter_changed, 0, sizeof(m->filter_changed));
1432fb0ee5d7 mlpdec: Filters and matrices may change only once per substream per access unit.
ramiro
parents: 9349
diff changeset
1047
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1048 s->blockpos = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1049 do {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1050 if (get_bits1(&gb)) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1051 if (get_bits1(&gb)) {
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
1052 /* A restart header should be present. */
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1053 if (read_restart_header(m, &gb, buf, substr) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1054 goto next_substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1055 s->restart_seen = 1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1056 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1057
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
1058 if (!s->restart_seen)
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1059 goto next_substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1060 if (read_decoding_params(m, &gb, substr) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1061 goto next_substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1062 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1063
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
1064 if (!s->restart_seen)
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1065 goto next_substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1066
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1067 if (read_block_data(m, &gb, substr) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1068 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1069
9286
e02f401dde04 mlpdec: Simplify substream length mismatch error.
ramiro
parents: 9285
diff changeset
1070 if (get_bits_count(&gb) >= substream_data_len[substr] * 8)
e02f401dde04 mlpdec: Simplify substream length mismatch error.
ramiro
parents: 9285
diff changeset
1071 goto substream_length_mismatch;
e02f401dde04 mlpdec: Simplify substream length mismatch error.
ramiro
parents: 9285
diff changeset
1072
e02f401dde04 mlpdec: Simplify substream length mismatch error.
ramiro
parents: 9285
diff changeset
1073 } while (!get_bits1(&gb));
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1074
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1075 skip_bits(&gb, (-get_bits_count(&gb)) & 15);
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
1076
9284
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1077 if (substream_data_len[substr] * 8 - get_bits_count(&gb) >= 32) {
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1078 int shorten_by;
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1079
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1080 if (get_bits(&gb, 16) != 0xD234)
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1081 return -1;
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1082
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1083 shorten_by = get_bits(&gb, 16);
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1084 if (m->avctx->codec_id == CODEC_ID_TRUEHD && shorten_by & 0x2000)
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1085 s->blockpos -= FFMIN(shorten_by & 0x1FFF, s->blockpos);
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1086 else if (m->avctx->codec_id == CODEC_ID_MLP && shorten_by != 0xD234)
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1087 return -1;
4072adff072e mlpdec: Cleaner and better termination word check.
ramiro
parents: 9283
diff changeset
1088
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1089 if (substr == m->max_decoded_substream)
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
1090 av_log(m->avctx, AV_LOG_INFO, "End of stream indicated.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1091 }
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
1092
9288
37313693196a mlpdec: Simplify check for substream_parity_present.
ramiro
parents: 9287
diff changeset
1093 if (substream_parity_present[substr]) {
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1094 uint8_t parity, checksum;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1095
9288
37313693196a mlpdec: Simplify check for substream_parity_present.
ramiro
parents: 9287
diff changeset
1096 if (substream_data_len[substr] * 8 - get_bits_count(&gb) != 16)
37313693196a mlpdec: Simplify check for substream_parity_present.
ramiro
parents: 9287
diff changeset
1097 goto substream_length_mismatch;
37313693196a mlpdec: Simplify check for substream_parity_present.
ramiro
parents: 9287
diff changeset
1098
9285
f2f4f136add4 mlpdec: Prettify substream parity check.
ramiro
parents: 9284
diff changeset
1099 parity = ff_mlp_calculate_parity(buf, substream_data_len[substr] - 2);
f2f4f136add4 mlpdec: Prettify substream parity check.
ramiro
parents: 9284
diff changeset
1100 checksum = ff_mlp_checksum8 (buf, substream_data_len[substr] - 2);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1101
9285
f2f4f136add4 mlpdec: Prettify substream parity check.
ramiro
parents: 9284
diff changeset
1102 if ((get_bits(&gb, 8) ^ parity) != 0xa9 )
f2f4f136add4 mlpdec: Prettify substream parity check.
ramiro
parents: 9284
diff changeset
1103 av_log(m->avctx, AV_LOG_ERROR, "Substream %d parity check failed.\n", substr);
f2f4f136add4 mlpdec: Prettify substream parity check.
ramiro
parents: 9284
diff changeset
1104 if ( get_bits(&gb, 8) != checksum)
f2f4f136add4 mlpdec: Prettify substream parity check.
ramiro
parents: 9284
diff changeset
1105 av_log(m->avctx, AV_LOG_ERROR, "Substream %d checksum failed.\n" , substr);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1106 }
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
1107
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
1108 if (substream_data_len[substr] * 8 != get_bits_count(&gb))
9286
e02f401dde04 mlpdec: Simplify substream length mismatch error.
ramiro
parents: 9285
diff changeset
1109 goto substream_length_mismatch;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1110
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1111 next_substr:
9507
7e156421dcbc mlpdec: {}- and whitespace-related cosmetics.
ramiro
parents: 9506
diff changeset
1112 if (!s->restart_seen)
9287
b00fc746bdf4 mlpdec: Simplify no restart header seen error.
ramiro
parents: 9286
diff changeset
1113 av_log(m->avctx, AV_LOG_ERROR,
b00fc746bdf4 mlpdec: Simplify no restart header seen error.
ramiro
parents: 9286
diff changeset
1114 "No restart header present in substream %d.\n", substr);
b00fc746bdf4 mlpdec: Simplify no restart header seen error.
ramiro
parents: 9286
diff changeset
1115
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1116 buf += substream_data_len[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1117 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1118
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1119 rematrix_channels(m, m->max_decoded_substream);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1120
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1121 if (output_data(m, m->max_decoded_substream, data, data_size) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1122 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1123
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1124 return length;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1125
9286
e02f401dde04 mlpdec: Simplify substream length mismatch error.
ramiro
parents: 9285
diff changeset
1126 substream_length_mismatch:
e02f401dde04 mlpdec: Simplify substream length mismatch error.
ramiro
parents: 9285
diff changeset
1127 av_log(m->avctx, AV_LOG_ERROR, "substream %d length mismatch\n", substr);
e02f401dde04 mlpdec: Simplify substream length mismatch error.
ramiro
parents: 9285
diff changeset
1128 return -1;
e02f401dde04 mlpdec: Simplify substream length mismatch error.
ramiro
parents: 9285
diff changeset
1129
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1130 error:
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1131 m->params_valid = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1132 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1133 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1134
9190
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1135 #if CONFIG_MLP_DECODER
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1136 AVCodec mlp_decoder = {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1137 "mlp",
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1138 CODEC_TYPE_AUDIO,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1139 CODEC_ID_MLP,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1140 sizeof(MLPDecodeContext),
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1141 mlp_decode_init,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1142 NULL,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1143 NULL,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1144 read_access_unit,
9190
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1145 .long_name = NULL_IF_CONFIG_SMALL("MLP (Meridian Lossless Packing)"),
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1146 };
9190
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1147 #endif /* CONFIG_MLP_DECODER */
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1148
9190
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1149 #if CONFIG_TRUEHD_DECODER
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1150 AVCodec truehd_decoder = {
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1151 "truehd",
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1152 CODEC_TYPE_AUDIO,
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1153 CODEC_ID_TRUEHD,
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1154 sizeof(MLPDecodeContext),
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1155 mlp_decode_init,
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1156 NULL,
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1157 NULL,
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1158 read_access_unit,
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1159 .long_name = NULL_IF_CONFIG_SMALL("TrueHD"),
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1160 };
5b4f4d83431f Split TrueHD decoder from MLP
ramiro
parents: 9083
diff changeset
1161 #endif /* CONFIG_TRUEHD_DECODER */