annotate mlpdec.c @ 9613:56f0a4054770 libavcodec

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