FFmpeg
wavpack.h
Go to the documentation of this file.
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 
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 {
83 };
84 
85 typedef struct Decorr {
86  int delta;
87  int value;
88  int weightA;
89  int weightB;
92  int sumA;
93  int sumB;
94 } Decorr;
95 
96 typedef struct WvChannel {
97  int median[3];
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 */
WP_ID_SHAPING
@ WP_ID_SHAPING
Definition: wavpack.h:74
WvChannel::bitrate_delta
unsigned bitrate_delta
Definition: wavpack.h:99
WP_ID_DSD_DATA
@ WP_ID_DSD_DATA
Definition: wavpack.h:81
WP_ID_HYBRID
@ WP_ID_HYBRID
Definition: wavpack.h:73
WP_ID_FLOATINFO
@ WP_ID_FLOATINFO
Definition: wavpack.h:75
WvChannel::median
int median[3]
Definition: wavpack.h:97
WP_ID_DECWEIGHTS
@ WP_ID_DECWEIGHTS
Definition: wavpack.h:70
WP_IDF_LONG
@ WP_IDF_LONG
Definition: wavpack.h:63
MAX_TERM
#define MAX_TERM
Definition: wavpack.h:28
WvChannel
Definition: wavpack.h:96
Decorr::weightA
int weightA
Definition: wavpack.h:88
Decorr::sumA
int sumA
Definition: wavpack.h:92
WP_ID_DUMMY
@ WP_ID_DUMMY
Definition: wavpack.h:67
WP_ID_DATA
@ WP_ID_DATA
Definition: wavpack.h:77
Decorr
Definition: wavpack.h:85
WP_ID_SAMPLE_RATE
@ WP_ID_SAMPLE_RATE
Definition: wavpack.h:82
U
#define U(x)
Definition: vp56_arith.h:37
WP_ID_ENTROPY
@ WP_ID_ENTROPY
Definition: wavpack.h:72
val
static double val(void *priv, double ch)
Definition: aeval.c:76
wp_exp2_table
static const uint8_t wp_exp2_table[256]
Definition: wavpack.h:127
WvChannel::bitrate_acc
unsigned bitrate_acc
Definition: wavpack.h:99
wp_log2
static av_always_inline int wp_log2(uint32_t val)
Definition: wavpack.h:182
Decorr::delta
int delta
Definition: wavpack.h:86
WP_ID_EXTRABITS
@ WP_ID_EXTRABITS
Definition: wavpack.h:79
wv_rates
static const int wv_rates[16]
Definition: wavpack.h:121
bits
uint8_t bits
Definition: vp3data.h:202
wp_exp2
static av_always_inline int wp_exp2(int16_t val)
Definition: wavpack.h:165
Decorr::value
int value
Definition: wavpack.h:87
WP_ID_CORR
@ WP_ID_CORR
Definition: wavpack.h:78
WP_IDF_IGNORE
@ WP_IDF_IGNORE
Definition: wavpack.h:61
WvChannel::error_limit
int error_limit
Definition: wavpack.h:98
WP_IDF_ODD
@ WP_IDF_ODD
Definition: wavpack.h:62
Decorr::samplesA
int samplesA[MAX_TERM]
Definition: wavpack.h:90
WP_ID
WP_ID
Definition: wavpack.h:66
WP_ID_DECTERMS
@ WP_ID_DECTERMS
Definition: wavpack.h:69
Decorr::sumB
int sumB
Definition: wavpack.h:93
WP_ID_ENCINFO
@ WP_ID_ENCINFO
Definition: wavpack.h:68
common.h
av_always_inline
#define av_always_inline
Definition: attributes.h:49
WP_ID_CHANINFO
@ WP_ID_CHANINFO
Definition: wavpack.h:80
uint8_t
uint8_t
Definition: audio_convert.c:194
wp_log2_table
static const uint8_t wp_log2_table[]
Definition: wavpack.h:146
WP_ID_DECSAMPLES
@ WP_ID_DECSAMPLES
Definition: wavpack.h:71
WP_ID_Flags
WP_ID_Flags
Definition: wavpack.h:59
Decorr::weightB
int weightB
Definition: wavpack.h:89
WvChannel::slow_level
int slow_level
Definition: wavpack.h:98
WP_ID_INT32INFO
@ WP_ID_INT32INFO
Definition: wavpack.h:76
av_log2
int av_log2(unsigned v)
Definition: intmath.c:26
Decorr::samplesB
int samplesB[MAX_TERM]
Definition: wavpack.h:91
WP_IDF_MASK
@ WP_IDF_MASK
Definition: wavpack.h:60