annotate mlpdec.c @ 8058:509a7681c284 libavcodec

Use OBJS variable for all object files There is no longer any need to differentiate the object files by source type.
author mru
date Sat, 25 Oct 2008 14:00:28 +0000
parents d73cd240d68c
children 82dbfe8d2e0b
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 /**
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
23 * @file mlpdec.c
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 "
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
43 "http://ffmpeg.mplayerhq.hu/bugreports.html and include "
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
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
144 static av_cold void init_static()
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;
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7262
diff changeset
225 avctx->sample_fmt = SAMPLE_FMT_S16;
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
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
299 #ifdef CONFIG_AUDIO_NONSHORT
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
300 m->avctx->bits_per_sample = mh.group1_bits;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
301 if (mh.group1_bits > 16) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
302 m->avctx->sample_fmt = SAMPLE_FMT_S32;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
303 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
304 #endif
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
305
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
306 m->params_valid = 1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
307 for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
308 m->substream[substr].restart_seen = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
309
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
310 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
311 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
312
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
313 /** Read a restart header from a block in a substream. This contains parameters
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
314 * required to decode the audio that do not change very often. Generally
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
315 * (always) present only in blocks following a major sync. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
316
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
317 static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
318 const uint8_t *buf, unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
319 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
320 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
321 unsigned int ch;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
322 int sync_word, tmp;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
323 uint8_t checksum;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
324 uint8_t lossless_check;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
325 int start_count = get_bits_count(gbp);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
326
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
327 sync_word = get_bits(gbp, 13);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
328
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
329 if (sync_word != 0x31ea >> 1) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
330 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
331 "restart header sync incorrect (got 0x%04x)\n", sync_word);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
332 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
333 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
334 s->noise_type = get_bits1(gbp);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
335
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
336 skip_bits(gbp, 16); /* Output timestamp */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
337
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
338 s->min_channel = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
339 s->max_channel = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
340 s->max_matrix_channel = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
341
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
342 if (s->min_channel > s->max_channel) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
343 av_log(m->avctx, AV_LOG_ERROR,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
344 "Substream min channel cannot be greater than max channel.\n");
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
345 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
346 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
347
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
348 if (m->avctx->request_channels > 0
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
349 && s->max_channel + 1 >= m->avctx->request_channels
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
350 && substr < m->max_decoded_substream) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
351 av_log(m->avctx, AV_LOG_INFO,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
352 "Extracting %d channel downmix from substream %d. "
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
353 "Further substreams will be skipped.\n",
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
354 s->max_channel + 1, substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
355 m->max_decoded_substream = substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
356 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
357
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
358 s->noise_shift = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
359 s->noisegen_seed = get_bits(gbp, 23);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
360
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
361 skip_bits(gbp, 19);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
362
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
363 s->data_check_present = get_bits1(gbp);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
364 lossless_check = get_bits(gbp, 8);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
365 if (substr == m->max_decoded_substream
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
366 && s->lossless_check_data != 0xffffffff) {
7566
d112b4655bbd mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents: 7559
diff changeset
367 tmp = xor_32_to_8(s->lossless_check_data);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
368 if (tmp != lossless_check)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
369 av_log(m->avctx, AV_LOG_WARNING,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
370 "Lossless check failed - expected %02x, calculated %02x.\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
371 lossless_check, tmp);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
372 else
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
373 dprintf(m->avctx, "Lossless check passed for substream %d (%x).\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
374 substr, tmp);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
375 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
376
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
377 skip_bits(gbp, 16);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
378
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
379 for (ch = 0; ch <= s->max_matrix_channel; ch++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
380 int ch_assign = get_bits(gbp, 6);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
381 dprintf(m->avctx, "ch_assign[%d][%d] = %d\n", substr, ch,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
382 ch_assign);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
383 if (ch_assign != ch) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
384 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
385 "Non-1:1 channel assignments are used in this stream. %s\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
386 sample_message);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
387 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
388 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
389 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
390
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
391 checksum = ff_mlp_restart_checksum(buf, get_bits_count(gbp) - start_count);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
392
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
393 if (checksum != get_bits(gbp, 8))
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
394 av_log(m->avctx, AV_LOG_ERROR, "restart header checksum error\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
395
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
396 /* Set default decoding parameters. */
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
397 s->param_presence_flags = 0xff;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
398 s->num_primitive_matrices = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
399 s->blocksize = 8;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
400 s->lossless_check_data = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
401
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
402 memset(s->output_shift , 0, sizeof(s->output_shift ));
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
403 memset(s->quant_step_size, 0, sizeof(s->quant_step_size));
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
404
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
405 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
406 ChannelParams *cp = &m->channel_params[ch];
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
407 cp->filter_params[FIR].order = 0;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
408 cp->filter_params[IIR].order = 0;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
409 cp->filter_params[FIR].shift = 0;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
410 cp->filter_params[IIR].shift = 0;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
411
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
412 /* 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
413 cp->huff_offset = 0;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
414 cp->sign_huff_offset = (-1) << 23;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
415 cp->codebook = 0;
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
416 cp->huff_lsbs = 24;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
417 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
418
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
419 if (substr == m->max_decoded_substream) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
420 m->avctx->channels = s->max_channel + 1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
421 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
422
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
423 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
424 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
425
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
426 /** Read parameters for one of the prediction filters. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
427
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
428 static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
429 unsigned int channel, unsigned int filter)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
430 {
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
431 FilterParams *fp = &m->channel_params[channel].filter_params[filter];
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
432 const char fchar = filter ? 'I' : 'F';
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
433 int i, order;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
434
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
435 // Filter is 0 for FIR, 1 for IIR.
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
436 assert(filter < 2);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
437
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
438 order = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
439 if (order > MAX_FILTER_ORDER) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
440 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
441 "%cIR filter order %d is greater than maximum %d.\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
442 fchar, order, MAX_FILTER_ORDER);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
443 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
444 }
7552
88ffd7c9c0ed mlpdec: Split filter parameters from context into their own struct.
ramiro
parents: 7451
diff changeset
445 fp->order = order;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
446
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
447 if (order > 0) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
448 int coeff_bits, coeff_shift;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
449
7552
88ffd7c9c0ed mlpdec: Split filter parameters from context into their own struct.
ramiro
parents: 7451
diff changeset
450 fp->shift = get_bits(gbp, 4);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
451
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
452 coeff_bits = get_bits(gbp, 5);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
453 coeff_shift = get_bits(gbp, 3);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
454 if (coeff_bits < 1 || coeff_bits > 16) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
455 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
456 "%cIR filter coeff_bits must be between 1 and 16.\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
457 fchar);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
458 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
459 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
460 if (coeff_bits + coeff_shift > 16) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
461 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
462 "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
463 fchar);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
464 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
465 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
466
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
467 for (i = 0; i < order; i++)
7553
b5f8d814a206 mlpdec: whitespace and line-breaking cosmetics.
ramiro
parents: 7552
diff changeset
468 fp->coeff[i] = get_sbits(gbp, coeff_bits) << coeff_shift;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
469
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
470 if (get_bits1(gbp)) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
471 int state_bits, state_shift;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
472
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
473 if (filter == FIR) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
474 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
475 "FIR filter has state data specified.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
476 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
477 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
478
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
479 state_bits = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
480 state_shift = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
481
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
482 /* TODO: Check validity of state data. */
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
483
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
484 for (i = 0; i < order; i++)
7553
b5f8d814a206 mlpdec: whitespace and line-breaking cosmetics.
ramiro
parents: 7552
diff changeset
485 fp->state[i] = get_sbits(gbp, state_bits) << state_shift;
7194
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
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
489 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
490 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
491
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
492 /** Read decoding parameters that change more often than those in the restart
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
493 * header. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
494
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
495 static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
496 unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
497 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
498 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
499 unsigned int mat, ch;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
500
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
501 if (get_bits1(gbp))
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
502 s->param_presence_flags = get_bits(gbp, 8);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
503
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
504 if (s->param_presence_flags & PARAM_BLOCKSIZE)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
505 if (get_bits1(gbp)) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
506 s->blocksize = get_bits(gbp, 9);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
507 if (s->blocksize > MAX_BLOCKSIZE) {
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
508 av_log(m->avctx, AV_LOG_ERROR, "block size too large\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
509 s->blocksize = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
510 return -1;
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
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
514 if (s->param_presence_flags & PARAM_MATRIX)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
515 if (get_bits1(gbp)) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
516 s->num_primitive_matrices = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
517
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
518 for (mat = 0; mat < s->num_primitive_matrices; mat++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
519 int frac_bits, max_chan;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
520 s->matrix_out_ch[mat] = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
521 frac_bits = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
522 s->lsb_bypass [mat] = get_bits1(gbp);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
523
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
524 if (s->matrix_out_ch[mat] > s->max_channel) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
525 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
526 "Invalid channel %d specified as output from matrix.\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
527 s->matrix_out_ch[mat]);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
528 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
529 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
530 if (frac_bits > 14) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
531 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
532 "Too many fractional bits specified.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
533 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
534 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
535
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
536 max_chan = s->max_matrix_channel;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
537 if (!s->noise_type)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
538 max_chan+=2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
539
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
540 for (ch = 0; ch <= max_chan; ch++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
541 int coeff_val = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
542 if (get_bits1(gbp))
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
543 coeff_val = get_sbits(gbp, frac_bits + 2);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
544
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
545 s->matrix_coeff[mat][ch] = coeff_val << (14 - frac_bits);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
546 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
547
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
548 if (s->noise_type)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
549 s->matrix_noise_shift[mat] = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
550 else
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
551 s->matrix_noise_shift[mat] = 0;
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
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
555 if (s->param_presence_flags & PARAM_OUTSHIFT)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
556 if (get_bits1(gbp))
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
557 for (ch = 0; ch <= s->max_matrix_channel; ch++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
558 s->output_shift[ch] = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
559 dprintf(m->avctx, "output shift[%d] = %d\n",
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
560 ch, s->output_shift[ch]);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
561 /* TODO: validate */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
562 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
563
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
564 if (s->param_presence_flags & PARAM_QUANTSTEP)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
565 if (get_bits1(gbp))
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
566 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
567 ChannelParams *cp = &m->channel_params[ch];
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
568
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
569 s->quant_step_size[ch] = get_bits(gbp, 4);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
570 /* TODO: validate */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
571
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
572 cp->sign_huff_offset = calculate_sign_huff(m, substr, ch);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
573 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
574
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
575 for (ch = s->min_channel; ch <= s->max_channel; ch++)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
576 if (get_bits1(gbp)) {
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
577 ChannelParams *cp = &m->channel_params[ch];
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
578 FilterParams *fir = &cp->filter_params[FIR];
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
579 FilterParams *iir = &cp->filter_params[IIR];
7552
88ffd7c9c0ed mlpdec: Split filter parameters from context into their own struct.
ramiro
parents: 7451
diff changeset
580
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
581 if (s->param_presence_flags & PARAM_FIR)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
582 if (get_bits1(gbp))
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
583 if (read_filter_params(m, gbp, ch, FIR) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
584 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
585
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
586 if (s->param_presence_flags & PARAM_IIR)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
587 if (get_bits1(gbp))
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
588 if (read_filter_params(m, gbp, ch, IIR) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
589 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
590
7552
88ffd7c9c0ed mlpdec: Split filter parameters from context into their own struct.
ramiro
parents: 7451
diff changeset
591 if (fir->order && iir->order &&
88ffd7c9c0ed mlpdec: Split filter parameters from context into their own struct.
ramiro
parents: 7451
diff changeset
592 fir->shift != iir->shift) {
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
593 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
594 "FIR and IIR filters must use the same precision.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
595 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
596 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
597 /* The FIR and IIR filters must have the same precision.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
598 * To simplify the filtering code, only the precision of the
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
599 * FIR filter is considered. If only the IIR filter is employed,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
600 * the FIR filter precision is set to that of the IIR filter, so
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
601 * that the filtering code can use it. */
7552
88ffd7c9c0ed mlpdec: Split filter parameters from context into their own struct.
ramiro
parents: 7451
diff changeset
602 if (!fir->order && iir->order)
88ffd7c9c0ed mlpdec: Split filter parameters from context into their own struct.
ramiro
parents: 7451
diff changeset
603 fir->shift = iir->shift;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
604
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
605 if (s->param_presence_flags & PARAM_HUFFOFFSET)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
606 if (get_bits1(gbp))
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
607 cp->huff_offset = get_sbits(gbp, 15);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
608
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
609 cp->codebook = get_bits(gbp, 2);
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
610 cp->huff_lsbs = get_bits(gbp, 5);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
611
7555
8d00a2dfcb7a mlpdec: Split channel parameters from context into their own struct.
ramiro
parents: 7553
diff changeset
612 cp->sign_huff_offset = calculate_sign_huff(m, substr, ch);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
613
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
614 /* TODO: validate */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
615 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
616
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
617 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
618 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
619
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
620 #define MSB_MASK(bits) (-1u << bits)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
621
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
622 /** Generate PCM samples using the prediction filters and residual values
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
623 * read from the data stream, and update the filter state. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
624
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
625 static void filter_channel(MLPDecodeContext *m, unsigned int substr,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
626 unsigned int channel)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
627 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
628 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
629 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
630 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
631 &m->channel_params[channel].filter_params[IIR], };
7552
88ffd7c9c0ed mlpdec: Split filter parameters from context into their own struct.
ramiro
parents: 7451
diff changeset
632 unsigned int filter_shift = fp[FIR]->shift;
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
633 int32_t mask = MSB_MASK(s->quant_step_size[channel]);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
634 int index = MAX_BLOCKSIZE;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
635 int j, i;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
636
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
637 for (j = 0; j < NUM_FILTERS; j++) {
7553
b5f8d814a206 mlpdec: whitespace and line-breaking cosmetics.
ramiro
parents: 7552
diff changeset
638 memcpy(&filter_state_buffer[j][MAX_BLOCKSIZE], &fp[j]->state[0],
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
639 MAX_FILTER_ORDER * sizeof(int32_t));
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
640 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
641
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
642 for (i = 0; i < s->blocksize; i++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
643 int32_t residual = m->sample_buffer[i + s->blockpos][channel];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
644 unsigned int order;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
645 int64_t accum = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
646 int32_t result;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
647
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
648 /* TODO: Move this code to DSPContext? */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
649
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
650 for (j = 0; j < NUM_FILTERS; j++)
7552
88ffd7c9c0ed mlpdec: Split filter parameters from context into their own struct.
ramiro
parents: 7451
diff changeset
651 for (order = 0; order < fp[j]->order; order++)
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
652 accum += (int64_t)filter_state_buffer[j][index + order] *
7553
b5f8d814a206 mlpdec: whitespace and line-breaking cosmetics.
ramiro
parents: 7552
diff changeset
653 fp[j]->coeff[order];
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
654
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
655 accum = accum >> filter_shift;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
656 result = (accum + residual) & mask;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
657
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
658 --index;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
659
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
660 filter_state_buffer[FIR][index] = result;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
661 filter_state_buffer[IIR][index] = result - accum;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
662
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
663 m->sample_buffer[i + s->blockpos][channel] = result;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
664 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
665
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
666 for (j = 0; j < NUM_FILTERS; j++) {
7553
b5f8d814a206 mlpdec: whitespace and line-breaking cosmetics.
ramiro
parents: 7552
diff changeset
667 memcpy(&fp[j]->state[0], &filter_state_buffer[j][index],
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
668 MAX_FILTER_ORDER * sizeof(int32_t));
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
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
672 /** Read a block of PCM residual data (or actual if no filtering active). */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
673
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
674 static int read_block_data(MLPDecodeContext *m, GetBitContext *gbp,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
675 unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
676 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
677 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
678 unsigned int i, ch, expected_stream_pos = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
679
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
680 if (s->data_check_present) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
681 expected_stream_pos = get_bits_count(gbp);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
682 expected_stream_pos += get_bits(gbp, 16);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
683 av_log(m->avctx, AV_LOG_WARNING, "This file contains some features "
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
684 "we have not tested yet. %s\n", sample_message);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
685 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
686
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
687 if (s->blockpos + s->blocksize > m->access_unit_size) {
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
688 av_log(m->avctx, AV_LOG_ERROR, "too many audio samples in frame\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
689 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
690 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
691
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
692 memset(&m->bypassed_lsbs[s->blockpos][0], 0,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
693 s->blocksize * sizeof(m->bypassed_lsbs[0]));
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
694
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
695 for (i = 0; i < s->blocksize; i++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
696 if (read_huff_channels(m, gbp, substr, i) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
697 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
698 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
699
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
700 for (ch = s->min_channel; ch <= s->max_channel; ch++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
701 filter_channel(m, substr, ch);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
702 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
703
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
704 s->blockpos += s->blocksize;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
705
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
706 if (s->data_check_present) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
707 if (get_bits_count(gbp) != expected_stream_pos)
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
708 av_log(m->avctx, AV_LOG_ERROR, "block data length mismatch\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
709 skip_bits(gbp, 8);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
710 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
711
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
712 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
713 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
714
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
715 /** Data table used for TrueHD noise generation function. */
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
716
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
717 static const int8_t noise_table[256] = {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
718 30, 51, 22, 54, 3, 7, -4, 38, 14, 55, 46, 81, 22, 58, -3, 2,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
719 52, 31, -7, 51, 15, 44, 74, 30, 85, -17, 10, 33, 18, 80, 28, 62,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
720 10, 32, 23, 69, 72, 26, 35, 17, 73, 60, 8, 56, 2, 6, -2, -5,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
721 51, 4, 11, 50, 66, 76, 21, 44, 33, 47, 1, 26, 64, 48, 57, 40,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
722 38, 16, -10, -28, 92, 22, -18, 29, -10, 5, -13, 49, 19, 24, 70, 34,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
723 61, 48, 30, 14, -6, 25, 58, 33, 42, 60, 67, 17, 54, 17, 22, 30,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
724 67, 44, -9, 50, -11, 43, 40, 32, 59, 82, 13, 49, -14, 55, 60, 36,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
725 48, 49, 31, 47, 15, 12, 4, 65, 1, 23, 29, 39, 45, -2, 84, 69,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
726 0, 72, 37, 57, 27, 41, -15, -16, 35, 31, 14, 61, 24, 0, 27, 24,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
727 16, 41, 55, 34, 53, 9, 56, 12, 25, 29, 53, 5, 20, -20, -8, 20,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
728 13, 28, -3, 78, 38, 16, 11, 62, 46, 29, 21, 24, 46, 65, 43, -23,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
729 89, 18, 74, 21, 38, -12, 19, 12, -19, 8, 15, 33, 4, 57, 9, -8,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
730 36, 35, 26, 28, 7, 83, 63, 79, 75, 11, 3, 87, 37, 47, 34, 40,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
731 39, 19, 20, 42, 27, 34, 39, 77, 13, 42, 59, 64, 45, -1, 32, 37,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
732 45, -5, 53, -6, 7, 36, 50, 23, 6, 32, 9, -21, 18, 71, 27, 52,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
733 -25, 31, 35, 42, -1, 68, 63, 52, 26, 43, 66, 37, 41, 25, 40, 70,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
734 };
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
735
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
736 /** Noise generation functions.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
737 * I'm not sure what these are for - they seem to be some kind of pseudorandom
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
738 * sequence generators, used to generate noise data which is used when the
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
739 * channels are rematrixed. I'm not sure if they provide a practical benefit
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
740 * to compression, or just obfuscate the decoder. Are they for some kind of
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
741 * dithering? */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
742
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
743 /** Generate two channels of noise, used in the matrix when
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
744 * restart sync word == 0x31ea. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
745
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
746 static void generate_2_noise_channels(MLPDecodeContext *m, unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
747 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
748 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
749 unsigned int i;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
750 uint32_t seed = s->noisegen_seed;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
751 unsigned int maxchan = s->max_matrix_channel;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
752
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
753 for (i = 0; i < s->blockpos; i++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
754 uint16_t seed_shr7 = seed >> 7;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
755 m->sample_buffer[i][maxchan+1] = ((int8_t)(seed >> 15)) << s->noise_shift;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
756 m->sample_buffer[i][maxchan+2] = ((int8_t) seed_shr7) << s->noise_shift;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
757
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
758 seed = (seed << 16) ^ seed_shr7 ^ (seed_shr7 << 5);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
759 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
760
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
761 s->noisegen_seed = seed;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
762 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
763
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
764 /** Generate a block of noise, used when restart sync word == 0x31eb. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
765
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
766 static void fill_noise_buffer(MLPDecodeContext *m, unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
767 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
768 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
769 unsigned int i;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
770 uint32_t seed = s->noisegen_seed;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
771
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
772 for (i = 0; i < m->access_unit_size_pow2; i++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
773 uint8_t seed_shr15 = seed >> 15;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
774 m->noise_buffer[i] = noise_table[seed_shr15];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
775 seed = (seed << 8) ^ seed_shr15 ^ (seed_shr15 << 5);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
776 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
777
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
778 s->noisegen_seed = seed;
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
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
782 /** Apply the channel matrices in turn to reconstruct the original audio
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
783 * samples. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
784
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
785 static void rematrix_channels(MLPDecodeContext *m, unsigned int substr)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
786 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
787 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
788 unsigned int mat, src_ch, i;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
789 unsigned int maxchan;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
790
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
791 maxchan = s->max_matrix_channel;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
792 if (!s->noise_type) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
793 generate_2_noise_channels(m, substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
794 maxchan += 2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
795 } else {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
796 fill_noise_buffer(m, substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
797 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
798
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
799 for (mat = 0; mat < s->num_primitive_matrices; mat++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
800 int matrix_noise_shift = s->matrix_noise_shift[mat];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
801 unsigned int dest_ch = s->matrix_out_ch[mat];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
802 int32_t mask = MSB_MASK(s->quant_step_size[dest_ch]);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
803
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
804 /* TODO: DSPContext? */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
805
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
806 for (i = 0; i < s->blockpos; i++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
807 int64_t accum = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
808 for (src_ch = 0; src_ch <= maxchan; src_ch++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
809 accum += (int64_t)m->sample_buffer[i][src_ch]
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
810 * s->matrix_coeff[mat][src_ch];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
811 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
812 if (matrix_noise_shift) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
813 uint32_t index = s->num_primitive_matrices - mat;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
814 index = (i * (index * 2 + 1) + index) & (m->access_unit_size_pow2 - 1);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
815 accum += m->noise_buffer[index] << (matrix_noise_shift + 7);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
816 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
817 m->sample_buffer[i][dest_ch] = ((accum >> 14) & mask)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
818 + m->bypassed_lsbs[i][mat];
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
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
823 /** Write the audio data into the output buffer. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
824
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
825 static int output_data_internal(MLPDecodeContext *m, unsigned int substr,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
826 uint8_t *data, unsigned int *data_size, int is32)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
827 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
828 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
829 unsigned int i, ch = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
830 int32_t *data_32 = (int32_t*) data;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
831 int16_t *data_16 = (int16_t*) data;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
832
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
833 if (*data_size < (s->max_channel + 1) * s->blockpos * (is32 ? 4 : 2))
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
834 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
835
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
836 for (i = 0; i < s->blockpos; i++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
837 for (ch = 0; ch <= s->max_channel; ch++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
838 int32_t sample = m->sample_buffer[i][ch] << s->output_shift[ch];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
839 s->lossless_check_data ^= (sample & 0xffffff) << ch;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
840 if (is32) *data_32++ = sample << 8;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
841 else *data_16++ = sample >> 8;
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
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
845 *data_size = i * ch * (is32 ? 4 : 2);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
846
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
847 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
848 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
849
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
850 static int output_data(MLPDecodeContext *m, unsigned int substr,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
851 uint8_t *data, unsigned int *data_size)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
852 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
853 if (m->avctx->sample_fmt == SAMPLE_FMT_S32)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
854 return output_data_internal(m, substr, data, data_size, 1);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
855 else
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
856 return output_data_internal(m, substr, data, data_size, 0);
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
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
860 /** Read an access unit from the stream.
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
861 * Returns < 0 on error, 0 if not enough data is present in the input stream
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
862 * otherwise returns the number of bytes consumed. */
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
863
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
864 static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
865 const uint8_t *buf, int buf_size)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
866 {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
867 MLPDecodeContext *m = avctx->priv_data;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
868 GetBitContext gb;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
869 unsigned int length, substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
870 unsigned int substream_start;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
871 unsigned int header_size = 4;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
872 unsigned int substr_header_size = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
873 uint8_t substream_parity_present[MAX_SUBSTREAMS];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
874 uint16_t substream_data_len[MAX_SUBSTREAMS];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
875 uint8_t parity_bits;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
876
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
877 if (buf_size < 4)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
878 return 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
879
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
880 length = (AV_RB16(buf) & 0xfff) * 2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
881
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
882 if (length > buf_size)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
883 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
884
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
885 init_get_bits(&gb, (buf + 4), (length - 4) * 8);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
886
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
887 if (show_bits_long(&gb, 31) == (0xf8726fba >> 1)) {
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
888 dprintf(m->avctx, "Found major sync.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
889 if (read_major_sync(m, &gb) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
890 goto error;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
891 header_size += 28;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
892 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
893
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
894 if (!m->params_valid) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
895 av_log(m->avctx, AV_LOG_WARNING,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
896 "Stream parameters not seen; skipping frame.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
897 *data_size = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
898 return length;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
899 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
900
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
901 substream_start = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
902
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
903 for (substr = 0; substr < m->num_substreams; substr++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
904 int extraword_present, checkdata_present, end;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
905
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
906 extraword_present = get_bits1(&gb);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
907 skip_bits1(&gb);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
908 checkdata_present = get_bits1(&gb);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
909 skip_bits1(&gb);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
910
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
911 end = get_bits(&gb, 12) * 2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
912
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
913 substr_header_size += 2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
914
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
915 if (extraword_present) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
916 skip_bits(&gb, 16);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
917 substr_header_size += 2;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
918 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
919
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
920 if (end + header_size + substr_header_size > length) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
921 av_log(m->avctx, AV_LOG_ERROR,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
922 "Indicated length of substream %d data goes off end of "
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
923 "packet.\n", substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
924 end = length - header_size - substr_header_size;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
925 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
926
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
927 if (end < substream_start) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
928 av_log(avctx, AV_LOG_ERROR,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
929 "Indicated end offset of substream %d data "
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
930 "is smaller than calculated start offset.\n",
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
931 substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
932 goto error;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
933 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
934
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
935 if (substr > m->max_decoded_substream)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
936 continue;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
937
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
938 substream_parity_present[substr] = checkdata_present;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
939 substream_data_len[substr] = end - substream_start;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
940 substream_start = end;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
941 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
942
7559
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, 4);
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
944 parity_bits ^= ff_mlp_calculate_parity(buf + header_size, substr_header_size);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
945
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
946 if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
947 av_log(avctx, AV_LOG_ERROR, "Parity check failed.\n");
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
948 goto error;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
949 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
950
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
951 buf += header_size + substr_header_size;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
952
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
953 for (substr = 0; substr <= m->max_decoded_substream; substr++) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
954 SubStream *s = &m->substream[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
955 init_get_bits(&gb, buf, substream_data_len[substr] * 8);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
956
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
957 s->blockpos = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
958 do {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
959 if (get_bits1(&gb)) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
960 if (get_bits1(&gb)) {
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
961 /* A restart header should be present. */
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
962 if (read_restart_header(m, &gb, buf, substr) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
963 goto next_substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
964 s->restart_seen = 1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
965 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
966
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
967 if (!s->restart_seen) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
968 av_log(m->avctx, AV_LOG_ERROR,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
969 "No restart header present in substream %d.\n",
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
970 substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
971 goto next_substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
972 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
973
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
974 if (read_decoding_params(m, &gb, substr) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
975 goto next_substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
976 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
977
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
978 if (!s->restart_seen) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
979 av_log(m->avctx, AV_LOG_ERROR,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
980 "No restart header present in substream %d.\n",
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
981 substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
982 goto next_substr;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
983 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
984
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
985 if (read_block_data(m, &gb, substr) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
986 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
987
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
988 } while ((get_bits_count(&gb) < substream_data_len[substr] * 8)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
989 && get_bits1(&gb) == 0);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
990
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
991 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
992 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
993 (show_bits_long(&gb, 32) == END_OF_STREAM ||
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
994 show_bits_long(&gb, 20) == 0xd234e)) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
995 skip_bits(&gb, 18);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
996 if (substr == m->max_decoded_substream)
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
997 av_log(m->avctx, AV_LOG_INFO, "End of stream indicated.\n");
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
998
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
999 if (get_bits1(&gb)) {
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1000 int shorten_by = get_bits(&gb, 13);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1001 shorten_by = FFMIN(shorten_by, s->blockpos);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1002 s->blockpos -= shorten_by;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1003 } else
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1004 skip_bits(&gb, 13);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1005 }
7262
e3822c61f2e4 mlpdec: Check for bits left before each read of End-of-Stream indicator and
ramiro
parents: 7199
diff changeset
1006 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
1007 substream_parity_present[substr]) {
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1008 uint8_t parity, checksum;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1009
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
1010 parity = ff_mlp_calculate_parity(buf, substream_data_len[substr] - 2);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1011 if ((parity ^ get_bits(&gb, 8)) != 0xa9)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1012 av_log(m->avctx, AV_LOG_ERROR,
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
1013 "Substream %d parity check failed.\n", substr);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1014
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents: 7556
diff changeset
1015 checksum = ff_mlp_checksum8(buf, substream_data_len[substr] - 2);
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1016 if (checksum != get_bits(&gb, 8))
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
1017 av_log(m->avctx, AV_LOG_ERROR, "Substream %d checksum failed.\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1018 substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1019 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1020 if (substream_data_len[substr] * 8 != get_bits_count(&gb)) {
7198
479fc906650f spelling cosmetics
diego
parents: 7194
diff changeset
1021 av_log(m->avctx, AV_LOG_ERROR, "substream %d length mismatch\n",
7194
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1022 substr);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1023 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1024 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1025
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1026 next_substr:
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1027 buf += substream_data_len[substr];
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1028 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1029
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1030 rematrix_channels(m, m->max_decoded_substream);
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1031
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1032 if (output_data(m, m->max_decoded_substream, data, data_size) < 0)
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1033 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1034
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1035 return length;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1036
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1037 error:
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1038 m->params_valid = 0;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1039 return -1;
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1040 }
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1041
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,
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1051 .long_name = NULL_IF_CONFIG_SMALL("Meridian Lossless Packing"),
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1052 };
8427f12555a6 MLP/TrueHD decoder.
ramiro
parents:
diff changeset
1053