22 #define BITSTREAM_READER_LE
36 #define WV_HEADER_SIZE 32
38 #define WV_MONO 0x00000004
39 #define WV_JOINT_STEREO 0x00000010
40 #define WV_FALSE_STEREO 0x40000000
42 #define WV_HYBRID_MODE 0x00000008
43 #define WV_HYBRID_SHAPE 0x00000008
44 #define WV_HYBRID_BITRATE 0x00000200
45 #define WV_HYBRID_BALANCE 0x00000400
46 #define WV_INITIAL_BLOCK 0x00000800
47 #define WV_FINAL_BLOCK 0x00001000
49 #define WV_SINGLE_BLOCK (WV_INITIAL_BLOCK | WV_FINAL_BLOCK)
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
134 #define WV_MAX_FRAME_DECODERS 14
148 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000,
149 32000, 44100, 48000, 64000, 88200, 96000, 192000, 0
154 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
155 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
156 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
157 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
158 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
159 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
160 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
161 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
162 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
163 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
164 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
165 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
166 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
167 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
168 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
169 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
173 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
174 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
175 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
176 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
177 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
178 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
179 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
180 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
181 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
182 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
183 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
184 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
185 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
186 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
187 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
188 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
202 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
203 return neg ? -res : res;
219 return (bits << 8) +
wp_log2_table[(val >> (bits - 9)) & 0xFF];
222 #define LEVEL_DECAY(a) ((a + 0x80) >> 8)
225 #define GET_MED(n) ((c->median[n] >> 4) + 1)
226 #define DEC_MED(n) c->median[n] -= ((c->median[n] + (128 >> n) - 2) / (128 >> n)) * 2
227 #define INC_MED(n) c->median[n] += ((c->median[n] + (128 >> n) ) / (128 >> n)) * 5
230 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
231 if (samples && in) { \
232 if ((samples ^ in) < 0) { \
234 if (weight < -1024) \
250 e = (1 << (p + 1)) - k - 1;
267 int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
268 if (balance > br[0]) {
271 }
else if (-balance > br[0]) {
275 br[1] = br[0] + balance;
276 br[0] = br[0] - balance;
281 if (sl[i] - br[i] > -0x100)
292 int channel,
int *last)
295 int sign, base, add, ret;
313 t =
get_bits(gb, t - 1) | (1 << (t - 1));
344 t +=
get_bits(gb, t2 - 1) | (1 << (t2 - 1));
358 if (ctx->
hybrid && !channel)
388 int mid = (base * 2 + add + 1) >> 1;
396 add = mid - base - 1;
397 mid = (base * 2 + add + 1) >> 1;
404 return sign ? ~ret : ret;
422 *crc = *crc * 9 + (S & 0xffff) * 3 + ((
unsigned)S >> 16);
426 bit = (S & s->
and) | s->
or;
427 bit = ((S + bit) << s->
shift) - bit;
446 const int max_bits = 1 + 23 + 8 + 1;
458 if (S >= 0x1000000) {
477 S |= (1 << shift) - 1;
503 *crc = *crc * 27 + S * 9 + exp * 3 + sign;
505 value.u = (sign << 31) | (exp << 23) |
S;
516 uint32_t crc_extra_bits)
531 void *dst_l,
void *dst_r,
const int type)
537 uint32_t crc = s->
sc.
crc;
539 int16_t *dst16_l = dst_l;
540 int16_t *dst16_r = dst_r;
543 float *dstfl_l = dst_l;
544 float *dstfl_r = dst_r;
554 for (i = 0; i < s->
terms; i++) {
586 }
else if (t == -1) {
624 L += (R -= (L >> 1));
625 crc = (crc * 3 +
L) * 3 + R;
638 }
while (!last && count < s->samples);
649 void *dst,
const int type)
655 uint32_t crc = s->
sc.
crc;
657 int16_t *dst16 = dst;
667 for (i = 0; i < s->
terms; i++) {
699 }
while (!last && count < s->samples);
755 void *samples_l, *samples_r;
757 int got_terms = 0, got_weights = 0, got_samples = 0,
758 got_entropy = 0, got_bs = 0, got_float = 0, got_hybrid = 0;
759 int i, j,
id,
size, ssize, weights, t;
760 int bpp, chan = 0, chmask = 0, orig_bpp, sample_rate = 0;
768 s = wc->
fdec[block_no];
776 memset(s->
ch, 0,
sizeof(s->
ch));
783 s->
samples = bytestream2_get_le32(&gb);
802 s->
CRC = bytestream2_get_le32(&gb);
806 id = bytestream2_get_byte(&gb);
807 size = bytestream2_get_byte(&gb);
809 size |= (bytestream2_get_byte(&gb)) << 8;
810 size |= (bytestream2_get_byte(&gb)) << 16;
818 "Got incorrect block %02X with size %i\n",
id, size);
823 "Block size %i is out of bounds\n", size);
835 for (i = 0; i < s->
terms; i++) {
836 uint8_t val = bytestream2_get_byte(&gb);
853 for (i = 0; i < weights; i++) {
854 t = (int8_t)bytestream2_get_byte(&gb);
860 t = (int8_t)bytestream2_get_byte(&gb);
875 for (i = s->
terms - 1; (i >= 0) && (t < size); i--) {
878 wp_exp2(bytestream2_get_le16(&gb));
880 wp_exp2(bytestream2_get_le16(&gb));
884 wp_exp2(bytestream2_get_le16(&gb));
886 wp_exp2(bytestream2_get_le16(&gb));
892 wp_exp2(bytestream2_get_le16(&gb));
894 wp_exp2(bytestream2_get_le16(&gb));
899 wp_exp2(bytestream2_get_le16(&gb));
902 wp_exp2(bytestream2_get_le16(&gb));
913 "Entropy vars size should be %i, got %i",
919 for (i = 0; i < 3; i++) {
931 for (i = 0; i < (s->
stereo_in + 1); i++) {
936 for (i = 0; i < (s->
stereo_in + 1); i++) {
938 wp_exp2((int16_t)bytestream2_get_le16(&gb));
950 "Invalid INT32INFO, size = %i\n",
980 "Invalid FLOATINFO, size = %i\n", size);
1015 "Insufficient channel information\n");
1018 chan = bytestream2_get_byte(&gb);
1021 chmask = bytestream2_get_byte(&gb);
1024 chmask = bytestream2_get_le16(&gb);
1027 chmask = bytestream2_get_le24(&gb);
1030 chmask = bytestream2_get_le32(&gb);;
1034 chan |= (bytestream2_get_byte(&gb) & 0xF) << 8;
1035 chmask = bytestream2_get_le16(&gb);
1049 sample_rate = bytestream2_get_le24(&gb);
1054 if (
id & WP_IDF_ODD)
1074 if (s->
hybrid && !got_hybrid) {
1089 if (size < wanted) {
1146 memcpy(samples_r, samples_l, bpp * s->
samples);
1162 int *got_frame_ptr,
AVPacket *avpkt)
1166 int buf_size = avpkt->
size;
1178 frame_flags =
AV_RL32(buf + 24);
1185 if (frame_flags & 0x80) {
1187 }
else if ((frame_flags & 0x03) <= 1) {
1194 while (buf_size > 0) {
1197 frame_size =
AV_RL32(buf + 4) - 12;
1200 if (frame_size <= 0 || frame_size > buf_size) {
1202 "Block %d has invalid size (size %d vs. %d bytes left)\n",
1203 s->
block, frame_size, buf_size);
1208 frame, buf, frame_size)) < 0) {
static av_always_inline int wp_exp2(int16_t val)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
This structure describes decoded (raw) audio or video data.
static void wavpack_decode_flush(AVCodecContext *avctx)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
#define WV_FLT_SHIFT_SAME
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
#define AV_CH_LAYOUT_STEREO
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
static int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc, int S)
static int get_unary_0_33(GetBitContext *gb)
Get unary code terminated by a 0 with a maximum length of 33.
static int decode(MimicContext *ctx, int quality, int num_coeffs, int is_iframe)
enum AVSampleFormat sample_fmt
audio sample format
AVCodec ff_wavpack_decoder
static int wavpack_decode_block(AVCodecContext *avctx, int block_no, AVFrame *frame, const uint8_t *buf, int buf_size)
static av_always_inline int wp_log2(int32_t val)
static const int wv_rates[16]
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
bitstream reader API header.
WavpackFrameContext * fdec[WV_MAX_FRAME_DECODERS]
static const uint8_t frame_size[4]
#define WV_FLT_SHIFT_ONES
static int get_bits_left(GetBitContext *gb)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static av_always_inline void bytestream2_skip(GetByteContext *g, unsigned int size)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static av_always_inline unsigned int bytestream2_get_buffer(GetByteContext *g, uint8_t *dst, unsigned int size)
static av_always_inline unsigned int bytestream2_get_bytes_left(GetByteContext *g)
void av_log(void *avcl, int level, const char *fmt,...)
const char * name
Name of the codec implementation.
uint64_t channel_layout
Audio channel layout.
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
audio channel layout utility functions
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
static int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, void *dst_l, void *dst_r, const int type)
static void wv_reset_saved_context(WavpackFrameContext *s)
static int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void *dst, const int type)
#define UPDATE_WEIGHT_CLIP(weight, delta, samples, in)
static av_always_inline int bytestream2_tell(GetByteContext *g)
static av_cold int wavpack_decode_end(AVCodecContext *avctx)
Libavcodec external API header.
int sample_rate
samples per second
main external API structure.
static void close(AVCodecParserContext *s)
static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static const uint8_t wp_log2_table[]
static unsigned int get_bits1(GetBitContext *s)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
static const uint8_t wp_exp2_table[256]
#define AV_EF_CRCCHECK
Verify checksums embedded in the bitstream (could be of either encoded or decoded data...
static int wavpack_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
static int wv_check_crc(WavpackFrameContext *s, uint32_t crc, uint32_t crc_extra_bits)
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
#define WV_HYBRID_BITRATE
static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, int channel, int *last)
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
static av_always_inline int get_tail(GetBitContext *gb, int k)
#define WV_FLT_SHIFT_SENT
common internal api header.
static av_cold void flush(AVCodecContext *avctx)
Flush (reset) the frame ID after seeking.
static av_cold int init(AVCodecParserContext *s)
GetBitContext gb_extra_bits
int channels
number of audio channels
static av_cold int wv_alloc_frame_context(WavpackContext *c)
static av_cold int wavpack_decode_init(AVCodecContext *avctx)
#define WV_MAX_FRAME_DECODERS
uint8_t ** extended_data
pointers to the data planes/channels.
#define AV_CH_LAYOUT_MONO
This structure stores compressed data.
int nb_samples
number of audio samples (per channel) described by this frame
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
static void update_error_limit(WavpackFrameContext *ctx)