annotate mlpdec.c @ 9379:d31c367da415 libavcodec

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