annotate wavpack.c @ 3990:746a60ba3177 libavcodec

enable CMOV_IS_FAST as its faster or equal speed on every cpu (duron, athlon, PM, P3) from which ive seen benchmarks, it might be slower on P4 but noone has posted benchmarks ...
author michael
date Wed, 11 Oct 2006 12:23:40 +0000
parents c8c591fe26f8
children b1a1fb651bf5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
1 /*
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
2 * WavPack lossless audio decoder
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
3 * Copyright (c) 2006 Konstantin Shishkov
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
16 *
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3782
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
20 */
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
21 #define ALT_BITSTREAM_READER_LE
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
22 #include "avcodec.h"
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
23 #include "bitstream.h"
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
24
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
25 /**
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
26 * @file wavpack.c
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
27 * WavPack lossless audio decoder
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
28 */
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
29
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
30 #define WV_JOINT 0x0010
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
31
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
32 enum WP_ID_Flags{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
33 WP_IDF_MASK = 0x1F,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
34 WP_IDF_IGNORE = 0x20,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
35 WP_IDF_ODD = 0x40,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
36 WP_IDF_LONG = 0x80
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
37 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
38
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
39 enum WP_ID{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
40 WP_ID_DUMMY = 0,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
41 WP_ID_ENCINFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
42 WP_ID_DECTERMS,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
43 WP_ID_DECWEIGHTS,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
44 WP_ID_DECSAMPLES,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
45 WP_ID_ENTROPY,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
46 WP_ID_HYBRID,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
47 WP_ID_SHAPING,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
48 WP_ID_FLOATINFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
49 WP_ID_INT32INFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
50 WP_ID_DATA,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
51 WP_ID_CORR,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
52 WP_ID_FLT,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
53 WP_ID_CHANINFO
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
54 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
55
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
56 #define MAX_TERMS 16
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
57
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
58 typedef struct Decorr {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
59 int delta;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
60 int value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
61 int weightA;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
62 int weightB;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
63 int samplesA[8];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
64 int samplesB[8];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
65 } Decorr;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
66
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
67 typedef struct WavpackContext {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
68 AVCodecContext *avctx;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
69 int stereo;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
70 int joint;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
71 uint32_t CRC;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
72 GetBitContext gb;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
73 int data_size; // in bits
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
74 int samples;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
75 int median[6];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
76 int terms;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
77 Decorr decorr[MAX_TERMS];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
78 int zero, one, zeroes;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
79 } WavpackContext;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
80
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
81 // exponent table copied from WavPack source
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
82 static const uint8_t wp_exp2_table [256] = {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
83 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
84 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
85 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
86 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
87 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
88 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
89 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
90 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
91 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
92 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
93 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
94 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
95 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
96 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
97 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
98 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
99 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
100
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
101 static always_inline int wp_exp2(int16_t val)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
102 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
103 int res, neg = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
104
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
105 if(val < 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
106 val = -val;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
107 neg = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
108 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
109
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
110 res = wp_exp2_table[val & 0xFF] | 0x100;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
111 val >>= 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
112 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
113 return neg ? -res : res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
114 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
115
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
116 static inline int get_unary(GetBitContext *gb){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
117 int r=0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
118 while(get_bits1(gb) && r<33)r++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
119 return r;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
120 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
121
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
122 // macros for manipulating median values
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
123 #define GET_MED(n) ((median[n] >> 4) + 1)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
124 #define DEC_MED(n) median[n] -= ((median[n] + (128>>n) - 2) / (128>>n)) * 2
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
125 #define INC_MED(n) median[n] += ((median[n] + (128>>n)) / (128>>n)) * 5
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
126
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
127 // macros for applying weight
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
128 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
129 if(samples && in){ \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
130 if((samples ^ in) < 0){ \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
131 weight -= delta; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
132 if(weight < -1024) weight = -1024; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
133 }else{ \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
134 weight += delta; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
135 if(weight > 1024) weight = 1024; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
136 } \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
137 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
138
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
139
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
140 static always_inline int get_tail(GetBitContext *gb, int k)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
141 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
142 int p, e, res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
143
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
144 if(k<1 || k>65535)return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
145 p = av_log2_16bit(k);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
146 e = (1 << (p + 1)) - k - 1;
3782
a8b80c80494b Handle case of get_bits(0)
kostya
parents: 3764
diff changeset
147 res = p ? get_bits(gb, p) : 0;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
148 if(res >= e){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
149 res = (res<<1) - e + get_bits1(gb);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
150 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
151 return res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
152 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
153
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
154 static int wv_get_value(WavpackContext *ctx, GetBitContext *gb, int *median, int *last)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
155 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
156 int t, t2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
157 int sign, base, add, ret;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
158
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
159 *last = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
160
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
161 if((ctx->median[0] < 2U) && (ctx->median[3] < 2U) && !ctx->zero && !ctx->one){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
162 if(ctx->zeroes){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
163 ctx->zeroes--;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
164 if(ctx->zeroes)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
165 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
166 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
167 t = get_unary(gb);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
168 if(t >= 2) t = get_bits(gb, t - 1) | (1 << (t-1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
169 ctx->zeroes = t;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
170 if(ctx->zeroes){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
171 memset(ctx->median, 0, sizeof(ctx->median));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
172 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
173 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
174 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
175 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
176
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
177 if(get_bits_count(gb) >= ctx->data_size){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
178 *last = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
179 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
180 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
181
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
182 if(ctx->zero){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
183 t = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
184 ctx->zero = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
185 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
186 t = get_unary(gb);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
187 if(get_bits_count(gb) >= ctx->data_size){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
188 *last = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
189 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
190 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
191 if(t == 16) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
192 t2 = get_unary(gb);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
193 if(t2 < 2) t += t2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
194 else t += get_bits(gb, t2 - 1) | (1 << (t2 - 1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
195 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
196
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
197 if(ctx->one){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
198 ctx->one = t&1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
199 t = (t>>1) + 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
200 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
201 ctx->one = t&1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
202 t >>= 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
203 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
204 ctx->zero = !ctx->one;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
205 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
206
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
207 if(!t){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
208 base = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
209 add = GET_MED(0) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
210 DEC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
211 }else if(t == 1){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
212 base = GET_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
213 add = GET_MED(1) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
214 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
215 DEC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
216 }else if(t == 2){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
217 base = GET_MED(0) + GET_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
218 add = GET_MED(2) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
219 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
220 INC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
221 DEC_MED(2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
222 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
223 base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
224 add = GET_MED(2) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
225 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
226 INC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
227 INC_MED(2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
228 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
229 ret = base + get_tail(gb, add);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
230 sign = get_bits1(gb);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
231 return sign ? ~ret : ret;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
232 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
233
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
234 static int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, int16_t *dst)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
235 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
236 int i, j, count = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
237 int last, t;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
238 int A, B, L, L2, R, R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
239 int pos = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
240 uint32_t crc = 0xFFFFFFFF;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
241
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
242 s->one = s->zero = s->zeroes = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
243 do{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
244 L = wv_get_value(s, gb, s->median, &last);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
245 if(last) break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
246 R = wv_get_value(s, gb, s->median + 3, &last);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
247 if(last) break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
248 for(i = 0; i < s->terms; i++){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
249 t = s->decorr[i].value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
250 j = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
251 if(t > 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
252 if(t > 8){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
253 if(t & 1){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
254 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
255 B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
256 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
257 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
258 B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
259 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
260 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
261 s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
262 j = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
263 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
264 A = s->decorr[i].samplesA[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
265 B = s->decorr[i].samplesB[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
266 j = (pos + t) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
267 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
268 L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
269 R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
270 if(A && L) s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
271 if(B && R) s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
272 s->decorr[i].samplesA[j] = L = L2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
273 s->decorr[i].samplesB[j] = R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
274 }else if(t == -1){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
275 L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
276 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
277 L = L2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
278 R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
279 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
280 R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
281 s->decorr[i].samplesA[0] = R;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
282 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
283 R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
284 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, s->decorr[i].samplesB[0], R);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
285 R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
286
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
287 if(t == -3){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
288 R2 = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
289 s->decorr[i].samplesA[0] = R;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
290 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
291
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
292 L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
293 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
294 L = L2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
295 s->decorr[i].samplesB[0] = L;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
296 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
297 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
298 pos = (pos + 1) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
299 if(s->joint)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
300 L += (R -= (L >> 1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
301 crc = (crc * 3 + L) * 3 + R;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
302 *dst++ = L;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
303 *dst++ = R;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
304
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
305 count++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
306 }while(!last && count < s->samples);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
307
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
308 if(crc != s->CRC){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
309 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
310 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
311 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
312 return count * 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
313 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
314
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
315 static int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, int16_t *dst)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
316 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
317 int i, j, count = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
318 int last, t;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
319 int A, S, T;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
320 int pos = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
321 uint32_t crc = 0xFFFFFFFF;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
322
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
323 s->one = s->zero = s->zeroes = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
324 do{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
325 T = wv_get_value(s, gb, s->median, &last);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
326 S = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
327 if(last) break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
328 for(i = 0; i < s->terms; i++){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
329 t = s->decorr[i].value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
330 if(t > 8){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
331 if(t & 1)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
332 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
333 else
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
334 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
335 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
336 j = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
337 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
338 A = s->decorr[i].samplesA[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
339 j = (pos + t) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
340 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
341 S = T + ((s->decorr[i].weightA * A + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
342 if(A && T) s->decorr[i].weightA -= ((((T ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
343 s->decorr[i].samplesA[j] = T = S;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
344 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
345 pos = (pos + 1) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
346 crc = crc * 3 + S;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
347 *dst++ = S;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
348 count++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
349 }while(!last && count < s->samples);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
350
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
351 if(crc != s->CRC){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
352 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
353 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
354 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
355 return count;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
356 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
357
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
358 static int wavpack_decode_init(AVCodecContext *avctx)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
359 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
360 WavpackContext *s = avctx->priv_data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
361
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
362 s->avctx = avctx;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
363 s->stereo = (avctx->channels == 2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
364
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
365 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
366 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
367
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
368 static int wavpack_decode_close(AVCodecContext *avctx)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
369 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
370 // WavpackContext *s = avctx->priv_data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
371
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
372 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
373 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
374
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
375 static int wavpack_decode_frame(AVCodecContext *avctx,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
376 void *data, int *data_size,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
377 uint8_t *buf, int buf_size)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
378 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
379 WavpackContext *s = avctx->priv_data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
380 int16_t *samples = data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
381 int samplecount;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
382 int got_terms = 0, got_weights = 0, got_samples = 0, got_entropy = 0, got_bs = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
383 uint8_t* buf_end = buf + buf_size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
384 int i, j, id, size, ssize, weights, t;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
385
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
386 if (buf_size == 0) return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
387
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
388 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
389
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
390 s->samples = LE_32(buf); buf += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
391 s->joint = LE_32(buf) & WV_JOINT; buf += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
392 s->CRC = LE_32(buf); buf += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
393 // parse metadata blocks
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
394 while(buf < buf_end){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
395 id = *buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
396 size = *buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
397 if(id & WP_IDF_LONG) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
398 size |= (*buf++) << 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
399 size |= (*buf++) << 16;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
400 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
401 size <<= 1; // size is specified in words
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
402 ssize = size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
403 if(id & WP_IDF_ODD) size--;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
404 if(size < 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
405 av_log(avctx, AV_LOG_ERROR, "Got incorrect block %02X with size %i\n", id, size);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
406 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
407 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
408 if(buf + ssize > buf_end){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
409 av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
410 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
411 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
412 if(id & WP_IDF_IGNORE){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
413 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
414 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
415 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
416 switch(id & WP_IDF_MASK){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
417 case WP_ID_DECTERMS:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
418 s->terms = size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
419 if(s->terms > MAX_TERMS){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
420 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
421 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
422 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
423 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
424 for(i = 0; i < s->terms; i++) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
425 s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
426 s->decorr[s->terms - i - 1].delta = *buf >> 5;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
427 buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
428 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
429 got_terms = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
430 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
431 case WP_ID_DECWEIGHTS:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
432 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
433 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
434 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
435 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
436 weights = size >> s->stereo;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
437 if(weights > MAX_TERMS || weights > s->terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
438 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
439 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
440 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
441 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
442 for(i = 0; i < weights; i++) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
443 t = (int8_t)(*buf++);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
444 s->decorr[s->terms - i - 1].weightA = t << 3;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
445 if(s->decorr[s->terms - i - 1].weightA > 0)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
446 s->decorr[s->terms - i - 1].weightA += (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
447 if(s->stereo){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
448 t = (int8_t)(*buf++);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
449 s->decorr[s->terms - i - 1].weightB = t << 3;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
450 if(s->decorr[s->terms - i - 1].weightB > 0)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
451 s->decorr[s->terms - i - 1].weightB += (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
452 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
453 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
454 got_weights = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
455 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
456 case WP_ID_DECSAMPLES:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
457 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
458 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
459 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
460 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
461 t = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
462 for(i = s->terms - 1; (i >= 0) && (t < size); i--) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
463 if(s->decorr[i].value > 8){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
464 s->decorr[i].samplesA[0] = wp_exp2(LE_16(buf)); buf += 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
465 s->decorr[i].samplesA[1] = wp_exp2(LE_16(buf)); buf += 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
466 if(s->stereo){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
467 s->decorr[i].samplesB[0] = wp_exp2(LE_16(buf)); buf += 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
468 s->decorr[i].samplesB[1] = wp_exp2(LE_16(buf)); buf += 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
469 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
470 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
471 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
472 }else if(s->decorr[i].value < 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
473 s->decorr[i].samplesA[0] = wp_exp2(LE_16(buf)); buf += 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
474 s->decorr[i].samplesB[0] = wp_exp2(LE_16(buf)); buf += 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
475 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
476 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
477 for(j = 0; j < s->decorr[i].value; j++){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
478 s->decorr[i].samplesA[j] = wp_exp2(LE_16(buf)); buf += 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
479 if(s->stereo){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
480 s->decorr[i].samplesB[j] = wp_exp2(LE_16(buf)); buf += 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
481 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
482 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
483 t += s->decorr[i].value * 2 * avctx->channels;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
484 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
485 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
486 got_samples = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
487 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
488 case WP_ID_ENTROPY:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
489 if(size != 6 * avctx->channels){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
490 av_log(avctx, AV_LOG_ERROR, "Entropy vars size should be %i, got %i", 6 * avctx->channels, size);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
491 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
492 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
493 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
494 for(i = 0; i < 3 * avctx->channels; i++){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
495 s->median[i] = wp_exp2(LE_16(buf));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
496 buf += 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
497 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
498 got_entropy = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
499 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
500 case WP_ID_DATA:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
501 init_get_bits(&s->gb, buf, size * 8);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
502 s->data_size = size * 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
503 buf += size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
504 got_bs = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
505 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
506 default:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
507 buf += size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
508 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
509 if(id & WP_IDF_ODD) buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
510 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
511 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
512 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
513 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
514 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
515 if(!got_weights){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
516 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
517 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
518 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
519 if(!got_samples){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
520 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
521 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
522 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
523 if(!got_entropy){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
524 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
525 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
526 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
527 if(!got_bs){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
528 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
529 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
530 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
531
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
532 if(s->stereo)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
533 samplecount = wv_unpack_stereo(s, &s->gb, samples);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
534 else
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
535 samplecount = wv_unpack_mono(s, &s->gb, samples);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
536 *data_size = samplecount * 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
537
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
538 return buf_size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
539 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
540
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
541 AVCodec wavpack_decoder = {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
542 "wavpack",
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
543 CODEC_TYPE_AUDIO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
544 CODEC_ID_WAVPACK,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
545 sizeof(WavpackContext),
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
546 wavpack_decode_init,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
547 NULL,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
548 wavpack_decode_close,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
549 wavpack_decode_frame,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
550 };