annotate mlpdec.c @ 12045:f399ea693f46 libavcodec

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