Mercurial > libavcodec.hg
annotate mlp.h @ 8991:ca768cb2bfb6 libavcodec
Use last decoded SPS as current SPS in order to parse picture timing SEI
correctly. This works around an apparent H.264 standard deficiency.
Patch by Ivan Schreter, schreter gmx net
author | cehoyos |
---|---|
date | Fri, 20 Feb 2009 16:20:01 +0000 |
parents | 18737839ed27 |
children | 753780c4875e |
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 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
29 /** Maximum number of channels that can be decoded. */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
30 #define MAX_CHANNELS 16 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
31 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
32 /** 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
|
33 * 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
|
34 */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
35 #define MAX_MATRICES 15 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
36 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
37 /** Maximum number of substreams that can be decoded. This could also be set |
7560
0dc289443426
mlp: Cosmetics: Close comments in an extra line and
ramiro
parents:
7559
diff
changeset
|
38 * higher, but I haven't seen any examples with more than two. |
0dc289443426
mlp: Cosmetics: Close comments in an extra line and
ramiro
parents:
7559
diff
changeset
|
39 */ |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
40 #define MAX_SUBSTREAMS 2 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
41 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
42 /** maximum sample frequency seen in files */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
43 #define MAX_SAMPLERATE 192000 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
44 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
45 /** maximum number of audio samples within one access unit */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
46 #define MAX_BLOCKSIZE (40 * (MAX_SAMPLERATE / 48000)) |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
47 /** next power of two greater than MAX_BLOCKSIZE */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
48 #define MAX_BLOCKSIZE_POW2 (64 * (MAX_SAMPLERATE / 48000)) |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
49 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
50 /** number of allowed filters */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
51 #define NUM_FILTERS 2 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
52 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
53 /** The maximum number of taps in either the IIR or FIR filter; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
54 * I believe MLP actually specifies the maximum order for IIR filters as four, |
7560
0dc289443426
mlp: Cosmetics: Close comments in an extra line and
ramiro
parents:
7559
diff
changeset
|
55 * and that the sum of the orders of both filters must be <= 8. |
0dc289443426
mlp: Cosmetics: Close comments in an extra line and
ramiro
parents:
7559
diff
changeset
|
56 */ |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
57 #define MAX_FILTER_ORDER 8 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
58 |
7575
d73cd240d68c
mlp: Define End-of-Stream code in common header file and use it in decoder.
ramiro
parents:
7566
diff
changeset
|
59 /** 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
|
60 #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
|
61 |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
62 #define FIR 0 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
63 #define IIR 1 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
64 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
65 /** filter data */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
66 typedef struct { |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
67 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
|
68 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
|
69 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
70 int32_t coeff[MAX_FILTER_ORDER]; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
71 int32_t state[MAX_FILTER_ORDER]; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
72 } FilterParams; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
73 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
74 /** sample data coding information */ |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
75 typedef struct { |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
76 FilterParams filter_params[NUM_FILTERS]; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
77 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
78 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
|
79 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
|
80 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
|
81 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
|
82 } ChannelParams; |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
83 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
84 /** Tables defining the Huffman codes. |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
85 * 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
|
86 * "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
|
87 * 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
|
88 */ |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
89 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
|
90 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
91 /** 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
|
92 * 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
|
93 * 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
|
94 * last element, then XOR that with the last element. |
0dc289443426
mlp: Cosmetics: Close comments in an extra line and
ramiro
parents:
7559
diff
changeset
|
95 */ |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
96 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
|
97 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
|
98 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
99 /** 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
|
100 * 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
|
101 */ |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
102 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
|
103 |
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
104 /** XOR together all the bytes of a buffer. |
7560
0dc289443426
mlp: Cosmetics: Close comments in an extra line and
ramiro
parents:
7559
diff
changeset
|
105 * Does this belong in dspcontext? |
0dc289443426
mlp: Cosmetics: Close comments in an extra line and
ramiro
parents:
7559
diff
changeset
|
106 */ |
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
107 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
|
108 |
8693
18737839ed27
Add missing void keyword to parameterless function declarations.
diego
parents:
8248
diff
changeset
|
109 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
|
110 |
7566
d112b4655bbd
mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents:
7560
diff
changeset
|
111 /** XOR four bytes into one. */ |
d112b4655bbd
mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents:
7560
diff
changeset
|
112 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
|
113 { |
d112b4655bbd
mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents:
7560
diff
changeset
|
114 value ^= value >> 16; |
d112b4655bbd
mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents:
7560
diff
changeset
|
115 value ^= value >> 8; |
d112b4655bbd
mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents:
7560
diff
changeset
|
116 return value; |
d112b4655bbd
mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents:
7560
diff
changeset
|
117 } |
d112b4655bbd
mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents:
7560
diff
changeset
|
118 |
7760 | 119 #endif /* AVCODEC_MLP_H */ |