FFmpeg
Loading...
Searching...
No Matches
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 <limits.h>
26#include <stdint.h>
28#include "libavutil/intmath.h"
29
30#define MAX_TERMS 16
31#define MAX_TERM 8
32
33#define WV_HEADER_SIZE 32
34
35#define WV_MONO 0x00000004
36#define WV_JOINT_STEREO 0x00000010
37#define WV_CROSS_DECORR 0x00000020
38#define WV_FLOAT_DATA 0x00000080
39#define WV_INT32_DATA 0x00000100
40#define WV_FALSE_STEREO 0x40000000
41#define WV_DSD_DATA 0x80000000
42
43#define WV_HYBRID_MODE 0x00000008
44#define WV_HYBRID_SHAPE 0x00000008
45#define WV_HYBRID_BITRATE 0x00000200
46#define WV_HYBRID_BALANCE 0x00000400
47#define WV_INITIAL_BLOCK 0x00000800
48#define WV_FINAL_BLOCK 0x00001000
49
50#define WV_MONO_DATA (WV_MONO | WV_FALSE_STEREO)
51
52#define WV_SINGLE_BLOCK (WV_INITIAL_BLOCK | WV_FINAL_BLOCK)
53
54#define WV_FLT_SHIFT_ONES 0x01
55#define WV_FLT_SHIFT_SAME 0x02
56#define WV_FLT_SHIFT_SENT 0x04
57#define WV_FLT_ZERO_SENT 0x08
58#define WV_FLT_ZERO_SIGN 0x10
59
60#define WV_MAX_CHANNELS (1 << 12)
61#define WV_MAX_SAMPLES 150000
62
66 WP_IDF_ODD = 0x40,
68};
69
88
89typedef struct Decorr {
90 int delta;
91 int value;
96 int sumA;
97 int sumB;
98} Decorr;
99
105
106// macros for manipulating median values
107#define GET_MED(n) ((c->median[n] >> 4) + 1)
108#define DEC_MED(n) c->median[n] -= ((int)(c->median[n] + (128U >> (n)) - 2) / (128 >> (n))) * 2U
109#define INC_MED(n) c->median[n] += ((int)(c->median[n] + (128U >> (n)) ) / (128 >> (n))) * 5U
110
111// macros for applying weight
112#define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
113 if ((samples) && (in)) { \
114 if (((samples) ^ (in)) < 0) { \
115 (weight) -= (delta); \
116 if ((weight) < -1024) \
117 (weight) = -1024; \
118 } else { \
119 (weight) += (delta); \
120 if ((weight) > 1024) \
121 (weight) = 1024; \
122 } \
123 }
124
125static const int wv_rates[16] = {
126 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000,
127 32000, 44100, 48000, 64000, 88200, 96000, 192000, 0
128};
129
130// exponent table copied from WavPack source
131extern const uint8_t ff_wp_exp2_table[256];
132extern const uint8_t ff_wp_log2_table[256];
133
134static av_always_inline int wp_exp2(int16_t val)
135{
136 int res, neg = 0;
137
138 if (val < 0) {
139 val = -val;
140 neg = 1;
141 }
142
143 res = ff_wp_exp2_table[val & 0xFF] | 0x100;
144 val >>= 8;
145 if (val > 31U)
146 return INT_MIN;
147 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
148 return neg ? -res : res;
149}
150
151static av_always_inline int wp_log2(uint32_t val)
152{
153 int bits;
154
155 if (!val)
156 return 0;
157 if (val == 1)
158 return 256;
159 val += val >> 9;
160 bits = av_log2(val) + 1;
161 if (bits < 9)
162 return (bits << 8) + ff_wp_log2_table[(val << (9 - bits)) & 0xFF];
163 else
164 return (bits << 8) + ff_wp_log2_table[(val >> (bits - 9)) & 0xFF];
165}
166
167#endif /* AVCODEC_WAVPACK_H */
static double val(void *priv, double ch)
Definition aeval.c:77
static const uint8_t bits[8]
Definition fastaudio.c:100
#define av_log2
Definition intmath.h:84
Macro definitions for various function/variable attributes.
#define av_always_inline
Definition attributes.h:72
int sumB
Definition wavpack.h:97
int samplesB[MAX_TERM]
Definition wavpack.h:95
int sumA
Definition wavpack.h:96
int value
Definition wavpack.h:91
int samplesA[MAX_TERM]
Definition wavpack.h:94
int delta
Definition wavpack.h:90
int weightA
Definition wavpack.h:92
int weightB
Definition wavpack.h:93
unsigned bitrate_delta
Definition wavpack.h:103
int slow_level
Definition wavpack.h:102
int median[3]
Definition wavpack.h:101
unsigned bitrate_acc
Definition wavpack.h:103
int error_limit
Definition wavpack.h:102
static av_always_inline int wp_exp2(int16_t val)
Definition wavpack.h:134
WP_ID
Definition wavpack.h:70
@ WP_ID_DECTERMS
Definition wavpack.h:73
@ WP_ID_DECSAMPLES
Definition wavpack.h:75
@ WP_ID_SHAPING
Definition wavpack.h:78
@ WP_ID_EXTRABITS
Definition wavpack.h:83
@ WP_ID_INT32INFO
Definition wavpack.h:80
@ WP_ID_HYBRID
Definition wavpack.h:77
@ WP_ID_CORR
Definition wavpack.h:82
@ WP_ID_SAMPLE_RATE
Definition wavpack.h:86
@ WP_ID_ENTROPY
Definition wavpack.h:76
@ WP_ID_ENCINFO
Definition wavpack.h:72
@ WP_ID_DATA
Definition wavpack.h:81
@ WP_ID_CHANINFO
Definition wavpack.h:84
@ WP_ID_DECWEIGHTS
Definition wavpack.h:74
@ WP_ID_FLOATINFO
Definition wavpack.h:79
@ WP_ID_DUMMY
Definition wavpack.h:71
@ WP_ID_DSD_DATA
Definition wavpack.h:85
const uint8_t ff_wp_log2_table[256]
Definition wavpackdata.c:43
#define MAX_TERM
Definition wavpack.h:31
WP_ID_Flags
Definition wavpack.h:63
@ WP_IDF_ODD
Definition wavpack.h:66
@ WP_IDF_LONG
Definition wavpack.h:67
@ WP_IDF_MASK
Definition wavpack.h:64
@ WP_IDF_IGNORE
Definition wavpack.h:65
static const int wv_rates[16]
Definition wavpack.h:125
const uint8_t ff_wp_exp2_table[256]
Definition wavpackdata.c:24
static av_always_inline int wp_log2(uint32_t val)
Definition wavpack.h:151