Mercurial > libavcodec.hg
annotate mlp.h @ 12266:48d6738904a9 libavcodec
Fix SPLATB_REG mess. Used to be a if/elseif/elseif/elseif spaghetti, so this
splits it into small optimization-specific macros which are selected for each
DSP function. The advantage of this approach is that the sse4 functions now
use the ssse3 codepath also without needing an explicit sse4 codepath.
author | rbultje |
---|---|
date | Sat, 24 Jul 2010 19:33:05 +0000 |
parents | 38147f0f94cc |
children |
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 | 22 #ifndef AVCODEC_MLP_H |
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 | 32 /** Maximum number of channels in a valid stream. |
33 * MLP : 5.1 + 2 noise channels -> 8 channels | |
34 * TrueHD: 7.1 -> 8 channels | |
35 */ | |
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 | 41 #define MAX_MATRICES_MLP 6 |
42 #define MAX_MATRICES_TRUEHD 8 | |
9533 | 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 | 45 /** Maximum number of substreams that can be decoded. |
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 | 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 | 127 #endif /* AVCODEC_MLP_H */ |