annotate mlpdec.c @ 9191:fa58c81d8cde libavcodec

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