]> git.sesse.net Git - ffmpeg/blob - libavcodec/wavpack.h
avcodec/dvbsubdec: prefer to use variable instead of type for sizeof
[ffmpeg] / libavcodec / wavpack.h
1 /*
2  * WavPack decoder/encoder common code
3  * Copyright (c) 2006,2011 Konstantin Shishkov
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 #ifndef AVCODEC_WAVPACK_H
23 #define AVCODEC_WAVPACK_H
24
25 #include "libavutil/common.h"
26
27 #define MAX_TERMS      16
28 #define MAX_TERM        8
29
30 #define WV_HEADER_SIZE    32
31
32 #define WV_MONO           0x00000004
33 #define WV_JOINT_STEREO   0x00000010
34 #define WV_CROSS_DECORR   0x00000020
35 #define WV_FLOAT_DATA     0x00000080
36 #define WV_INT32_DATA     0x00000100
37 #define WV_FALSE_STEREO   0x40000000
38 #define WV_DSD_DATA       0x80000000
39
40 #define WV_HYBRID_MODE    0x00000008
41 #define WV_HYBRID_SHAPE   0x00000008
42 #define WV_HYBRID_BITRATE 0x00000200
43 #define WV_HYBRID_BALANCE 0x00000400
44 #define WV_INITIAL_BLOCK  0x00000800
45 #define WV_FINAL_BLOCK    0x00001000
46
47 #define WV_MONO_DATA    (WV_MONO | WV_FALSE_STEREO)
48
49 #define WV_SINGLE_BLOCK (WV_INITIAL_BLOCK | WV_FINAL_BLOCK)
50
51 #define WV_FLT_SHIFT_ONES 0x01
52 #define WV_FLT_SHIFT_SAME 0x02
53 #define WV_FLT_SHIFT_SENT 0x04
54 #define WV_FLT_ZERO_SENT  0x08
55 #define WV_FLT_ZERO_SIGN  0x10
56
57 #define WV_MAX_SAMPLES    150000
58
59 enum WP_ID_Flags {
60     WP_IDF_MASK   = 0x3F,
61     WP_IDF_IGNORE = 0x20,
62     WP_IDF_ODD    = 0x40,
63     WP_IDF_LONG   = 0x80
64 };
65
66 enum WP_ID {
67     WP_ID_DUMMY = 0,
68     WP_ID_ENCINFO,
69     WP_ID_DECTERMS,
70     WP_ID_DECWEIGHTS,
71     WP_ID_DECSAMPLES,
72     WP_ID_ENTROPY,
73     WP_ID_HYBRID,
74     WP_ID_SHAPING,
75     WP_ID_FLOATINFO,
76     WP_ID_INT32INFO,
77     WP_ID_DATA,
78     WP_ID_CORR,
79     WP_ID_EXTRABITS,
80     WP_ID_CHANINFO,
81     WP_ID_DSD_DATA,
82     WP_ID_SAMPLE_RATE = 0x27,
83 };
84
85 typedef struct Decorr {
86     int delta;
87     int value;
88     int weightA;
89     int weightB;
90     int samplesA[MAX_TERM];
91     int samplesB[MAX_TERM];
92     int sumA;
93     int sumB;
94 } Decorr;
95
96 typedef struct WvChannel {
97     int median[3];
98     int slow_level, error_limit;
99     unsigned bitrate_acc, bitrate_delta;
100 } WvChannel;
101
102 // macros for manipulating median values
103 #define GET_MED(n) ((c->median[n] >> 4) + 1)
104 #define DEC_MED(n) c->median[n] -= ((int)(c->median[n] + (128U >> (n)) - 2) / (128 >> (n))) * 2U
105 #define INC_MED(n) c->median[n] += ((int)(c->median[n] + (128U >> (n))    ) / (128 >> (n))) * 5U
106
107 // macros for applying weight
108 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
109     if ((samples) && (in)) { \
110         if (((samples) ^ (in)) < 0) { \
111             (weight) -= (delta); \
112             if ((weight) < -1024) \
113                 (weight) = -1024; \
114         } else { \
115             (weight) += (delta); \
116             if ((weight) > 1024) \
117                 (weight) = 1024; \
118         } \
119     }
120
121 static const int wv_rates[16] = {
122      6000,  8000,  9600, 11025, 12000, 16000,  22050, 24000,
123     32000, 44100, 48000, 64000, 88200, 96000, 192000,     0
124 };
125
126 // exponent table copied from WavPack source
127 static const uint8_t wp_exp2_table[256] = {
128     0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
129     0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
130     0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
131     0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
132     0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
133     0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
134     0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
135     0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
136     0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
137     0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
138     0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
139     0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
140     0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
141     0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
142     0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
143     0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
144 };
145
146 static const uint8_t wp_log2_table [] = {
147     0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
148     0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
149     0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
150     0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
151     0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
152     0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
153     0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
154     0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
155     0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
156     0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
157     0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
158     0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
159     0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
160     0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
161     0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
162     0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
163 };
164
165 static av_always_inline int wp_exp2(int16_t val)
166 {
167     int res, neg = 0;
168
169     if (val < 0) {
170         val = -val;
171         neg = 1;
172     }
173
174     res   = wp_exp2_table[val & 0xFF] | 0x100;
175     val >>= 8;
176     if (val > 31U)
177         return INT_MIN;
178     res   = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
179     return neg ? -res : res;
180 }
181
182 static av_always_inline int wp_log2(uint32_t val)
183 {
184     int bits;
185
186     if (!val)
187         return 0;
188     if (val == 1)
189         return 256;
190     val += val >> 9;
191     bits = av_log2(val) + 1;
192     if (bits < 9)
193         return (bits << 8) + wp_log2_table[(val << (9 - bits)) & 0xFF];
194     else
195         return (bits << 8) + wp_log2_table[(val >> (bits - 9)) & 0xFF];
196 }
197
198 #endif /* AVCODEC_WAVPACK_H */