annotate mlp.h @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 38147f0f94cc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
1 /*
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
2 * MLP codec common header file
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
3 * Copyright (c) 2007-2008 Ian Caulfield
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
4 *
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
5 * This file is part of FFmpeg.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
6 *
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
11 *
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
15 * Lesser General Public License for more details.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
16 *
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
20 */
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
21
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7575
diff changeset
22 #ifndef AVCODEC_MLP_H
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7575
diff changeset
23 #define AVCODEC_MLP_H
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
24
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
25 #include <stdint.h>
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
26
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
27 #include "avcodec.h"
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
28
9531
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9278
diff changeset
29 /** Last possible matrix channel for each codec */
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9278
diff changeset
30 #define MAX_MATRIX_CHANNEL_MLP 5
19a70bcc2220 mlpdec: Validate max_channel and max_matrix_channel.
ramiro
parents: 9278
diff changeset
31 #define MAX_MATRIX_CHANNEL_TRUEHD 7
9533
b724134599eb mlpdec: Don't overallocate buffers.
ramiro
parents: 9532
diff changeset
32 /** Maximum number of channels in a valid stream.
b724134599eb mlpdec: Don't overallocate buffers.
ramiro
parents: 9532
diff changeset
33 * MLP : 5.1 + 2 noise channels -> 8 channels
b724134599eb mlpdec: Don't overallocate buffers.
ramiro
parents: 9532
diff changeset
34 * TrueHD: 7.1 -> 8 channels
b724134599eb mlpdec: Don't overallocate buffers.
ramiro
parents: 9532
diff changeset
35 */
b724134599eb mlpdec: Don't overallocate buffers.
ramiro
parents: 9532
diff changeset
36 #define MAX_CHANNELS 8
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
37
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
38 /** Maximum number of matrices used in decoding; most streams have one matrix
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
39 * per output channel, but some rematrix a channel (usually 0) more than once.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
40 */
9532
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
41 #define MAX_MATRICES_MLP 6
2aabf1a58f19 mlpdec: Validate num_primitive_matrices.
ramiro
parents: 9531
diff changeset
42 #define MAX_MATRICES_TRUEHD 8
9533
b724134599eb mlpdec: Don't overallocate buffers.
ramiro
parents: 9532
diff changeset
43 #define MAX_MATRICES 8
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
44
9201
753780c4875e truehd: support up to 3 substreams.
ramiro
parents: 8693
diff changeset
45 /** Maximum number of substreams that can be decoded.
753780c4875e truehd: support up to 3 substreams.
ramiro
parents: 8693
diff changeset
46 * MLP's limit is 2. TrueHD supports at least up to 3.
7560
0dc289443426 mlp: Cosmetics: Close comments in an extra line and
ramiro
parents: 7559
diff changeset
47 */
9201
753780c4875e truehd: support up to 3 substreams.
ramiro
parents: 8693
diff changeset
48 #define MAX_SUBSTREAMS 3
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
49
10273
38147f0f94cc Specify maximum sample rate of MLP by defining the factor relative to 48000
reimar
parents: 9647
diff changeset
50 /** which multiple of 48000 the maximum sample rate is */
38147f0f94cc Specify maximum sample rate of MLP by defining the factor relative to 48000
reimar
parents: 9647
diff changeset
51 #define MAX_RATEFACTOR 4
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
52 /** maximum sample frequency seen in files */
10273
38147f0f94cc Specify maximum sample rate of MLP by defining the factor relative to 48000
reimar
parents: 9647
diff changeset
53 #define MAX_SAMPLERATE (MAX_RATEFACTOR * 48000)
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
54
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
55 /** maximum number of audio samples within one access unit */
10273
38147f0f94cc Specify maximum sample rate of MLP by defining the factor relative to 48000
reimar
parents: 9647
diff changeset
56 #define MAX_BLOCKSIZE (40 * MAX_RATEFACTOR)
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
57 /** next power of two greater than MAX_BLOCKSIZE */
10273
38147f0f94cc Specify maximum sample rate of MLP by defining the factor relative to 48000
reimar
parents: 9647
diff changeset
58 #define MAX_BLOCKSIZE_POW2 (64 * MAX_RATEFACTOR)
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
59
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
60 /** number of allowed filters */
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
61 #define NUM_FILTERS 2
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
62
9278
41e285948ffc mlpdec: Max filter orders for FIR and IIR are 8 and 4 respectively.
ramiro
parents: 9201
diff changeset
63 /** The maximum number of taps in IIR and FIR filters. */
41e285948ffc mlpdec: Max filter orders for FIR and IIR are 8 and 4 respectively.
ramiro
parents: 9201
diff changeset
64 #define MAX_FIR_ORDER 8
41e285948ffc mlpdec: Max filter orders for FIR and IIR are 8 and 4 respectively.
ramiro
parents: 9201
diff changeset
65 #define MAX_IIR_ORDER 4
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
66
7575
d73cd240d68c mlp: Define End-of-Stream code in common header file and use it in decoder.
ramiro
parents: 7566
diff changeset
67 /** Code that signals end of a stream. */
d73cd240d68c mlp: Define End-of-Stream code in common header file and use it in decoder.
ramiro
parents: 7566
diff changeset
68 #define END_OF_STREAM 0xd234d234
d73cd240d68c mlp: Define End-of-Stream code in common header file and use it in decoder.
ramiro
parents: 7566
diff changeset
69
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
70 #define FIR 0
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
71 #define IIR 1
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
72
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
73 /** filter data */
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
74 typedef struct {
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
75 uint8_t order; ///< number of taps in filter
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
76 uint8_t shift; ///< Right shift to apply to output of filter.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
77
9278
41e285948ffc mlpdec: Max filter orders for FIR and IIR are 8 and 4 respectively.
ramiro
parents: 9201
diff changeset
78 int32_t state[MAX_FIR_ORDER];
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
79 } FilterParams;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
80
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
81 /** sample data coding information */
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
82 typedef struct {
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
83 FilterParams filter_params[NUM_FILTERS];
9647
d0fe5dc427f0 mlp: Simplify adressing of state and coeffs arrays for both filters by making
ramiro
parents: 9533
diff changeset
84 int32_t coeff[NUM_FILTERS][MAX_FIR_ORDER];
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
85
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
86 int16_t huff_offset; ///< Offset to apply to residual values.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
87 int32_t sign_huff_offset; ///< sign/rounding-corrected version of huff_offset
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
88 uint8_t codebook; ///< Which VLC codebook to use to read residuals.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
89 uint8_t huff_lsbs; ///< Size of residual suffix not encoded using VLC.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
90 } ChannelParams;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
91
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
92 /** Tables defining the Huffman codes.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
93 * There are three entropy coding methods used in MLP (four if you count
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
94 * "none" as a method). These use the same sequences for codes starting with
7560
0dc289443426 mlp: Cosmetics: Close comments in an extra line and
ramiro
parents: 7559
diff changeset
95 * 00 or 01, but have different codes starting with 1.
0dc289443426 mlp: Cosmetics: Close comments in an extra line and
ramiro
parents: 7559
diff changeset
96 */
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
97 extern const uint8_t ff_mlp_huffman_tables[3][18][2];
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
98
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
99 /** MLP uses checksums that seem to be based on the standard CRC algorithm, but
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
100 * are not (in implementation terms, the table lookup and XOR are reversed).
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
101 * We can implement this behavior using a standard av_crc on all but the
7560
0dc289443426 mlp: Cosmetics: Close comments in an extra line and
ramiro
parents: 7559
diff changeset
102 * last element, then XOR that with the last element.
0dc289443426 mlp: Cosmetics: Close comments in an extra line and
ramiro
parents: 7559
diff changeset
103 */
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
104 uint8_t ff_mlp_checksum8 (const uint8_t *buf, unsigned int buf_size);
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
105 uint16_t ff_mlp_checksum16(const uint8_t *buf, unsigned int buf_size);
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
106
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
107 /** Calculate an 8-bit checksum over a restart header -- a non-multiple-of-8
7560
0dc289443426 mlp: Cosmetics: Close comments in an extra line and
ramiro
parents: 7559
diff changeset
108 * number of bits, starting two bits into the first byte of buf.
0dc289443426 mlp: Cosmetics: Close comments in an extra line and
ramiro
parents: 7559
diff changeset
109 */
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
110 uint8_t ff_mlp_restart_checksum(const uint8_t *buf, unsigned int bit_size);
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
111
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
112 /** XOR together all the bytes of a buffer.
7560
0dc289443426 mlp: Cosmetics: Close comments in an extra line and
ramiro
parents: 7559
diff changeset
113 * Does this belong in dspcontext?
0dc289443426 mlp: Cosmetics: Close comments in an extra line and
ramiro
parents: 7559
diff changeset
114 */
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
115 uint8_t ff_mlp_calculate_parity(const uint8_t *buf, unsigned int buf_size);
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
116
8693
18737839ed27 Add missing void keyword to parameterless function declarations.
diego
parents: 8248
diff changeset
117 void ff_mlp_init_crc(void);
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
118
7566
d112b4655bbd mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents: 7560
diff changeset
119 /** XOR four bytes into one. */
d112b4655bbd mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents: 7560
diff changeset
120 static inline uint8_t xor_32_to_8(uint32_t value)
d112b4655bbd mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents: 7560
diff changeset
121 {
d112b4655bbd mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents: 7560
diff changeset
122 value ^= value >> 16;
d112b4655bbd mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents: 7560
diff changeset
123 value ^= value >> 8;
d112b4655bbd mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents: 7560
diff changeset
124 return value;
d112b4655bbd mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents: 7560
diff changeset
125 }
d112b4655bbd mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents: 7560
diff changeset
126
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 7575
diff changeset
127 #endif /* AVCODEC_MLP_H */