22 #define BITSTREAM_READER_LE
37 #define WV_HEADER_SIZE 32
39 #define WV_MONO 0x00000004
40 #define WV_JOINT_STEREO 0x00000010
41 #define WV_FALSE_STEREO 0x40000000
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
50 #define WV_SINGLE_BLOCK (WV_INITIAL_BLOCK | WV_FINAL_BLOCK)
52 #define WV_FLT_SHIFT_ONES 0x01
53 #define WV_FLT_SHIFT_SAME 0x02
54 #define WV_FLT_SHIFT_SENT 0x04
55 #define WV_FLT_ZERO_SENT 0x08
56 #define WV_FLT_ZERO_SIGN 0x10
58 #define WV_MAX_SAMPLES 131072
137 #define WV_MAX_FRAME_DECODERS 14
151 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000,
152 32000, 44100, 48000, 64000, 88200, 96000, 192000, 0
157 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
158 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
159 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
160 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
161 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
162 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
163 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
164 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
165 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
166 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
167 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
168 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
169 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
170 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
171 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
172 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
176 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
177 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
178 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
179 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
180 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
181 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
182 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
183 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
184 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
185 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
186 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
187 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
188 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
189 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
190 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
191 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
205 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
206 return neg ? -res :
res;
222 return (bits << 8) +
wp_log2_table[(val >> (bits - 9)) & 0xFF];
225 #define LEVEL_DECAY(a) ((a + 0x80) >> 8)
228 #define GET_MED(n) ((c->median[n] >> 4) + 1)
229 #define DEC_MED(n) c->median[n] -= ((c->median[n] + (128 >> n) - 2) / (128 >> n)) * 2
230 #define INC_MED(n) c->median[n] += ((c->median[n] + (128 >> n) ) / (128 >> n)) * 5
233 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
234 if (samples && in) { \
235 if ((samples ^ in) < 0) { \
237 if (weight < -1024) \
253 e = (1 << (p + 1)) - k - 1;
270 int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
271 if (balance > br[0]) {
274 }
else if (-balance > br[0]) {
278 br[1] = br[0] + balance;
279 br[0] = br[0] - balance;
284 if (sl[i] - br[i] > -0x100)
295 int channel,
int *last)
298 int sign, base, add,
ret;
316 t =
get_bits(gb, t - 1) | (1 << (t - 1));
347 t +=
get_bits(gb, t2 - 1) | (1 << (t2 - 1));
361 if (ctx->
hybrid && !channel)
387 if (add >= 0x2000000U) {
395 int mid = (base * 2 + add + 1) >> 1;
403 add = mid - base - 1;
404 mid = (base * 2 + add + 1) >> 1;
411 return sign ? ~ret :
ret;
429 *crc = *crc * 9 + (S & 0xffff) * 3 + ((
unsigned)S >> 16);
433 bit = (S & s->
and) | s->
or;
434 bit = ((S + bit) << s->
shift) - bit;
453 const int max_bits = 1 + 23 + 8 + 1;
465 if (S >= 0x1000000) {
484 S |= (1 <<
shift) - 1;
510 *crc = *crc * 27 + S * 9 + exp * 3 + sign;
512 value.u = (sign << 31) | (exp << 23) |
S;
523 uint32_t crc_extra_bits)
538 void *dst_l,
void *dst_r,
const int type)
544 uint32_t crc = s->
sc.
crc;
546 int16_t *dst16_l = dst_l;
547 int16_t *dst16_r = dst_r;
550 float *dstfl_l = dst_l;
551 float *dstfl_r = dst_r;
561 for (i = 0; i < s->
terms; i++) {
593 }
else if (t == -1) {
631 L += (R -= (L >> 1));
632 crc = (crc * 3 +
L) * 3 + R;
645 }
while (!last && count < s->samples);
656 void *dst,
const int type)
662 uint32_t crc = s->
sc.
crc;
664 int16_t *dst16 = dst;
674 for (i = 0; i < s->
terms; i++) {
706 }
while (!last && count < s->samples);
768 void *samples_l, *samples_r;
770 int got_terms = 0, got_weights = 0, got_samples = 0,
771 got_entropy = 0, got_bs = 0, got_float = 0, got_hybrid = 0;
772 int i, j,
id,
size, ssize, weights,
t;
773 int bpp, chan = 0, chmask = 0, orig_bpp,
sample_rate = 0;
781 s = wc->
fdec[block_no];
789 memset(s->
ch, 0,
sizeof(s->
ch));
796 s->
samples = bytestream2_get_le32(&gb);
815 s->
CRC = bytestream2_get_le32(&gb);
819 id = bytestream2_get_byte(&gb);
820 size = bytestream2_get_byte(&gb);
822 size |= (bytestream2_get_byte(&gb)) << 8;
823 size |= (bytestream2_get_byte(&gb)) << 16;
831 "Got incorrect block %02X with size %i\n",
id, size);
836 "Block size %i is out of bounds\n", size);
848 for (i = 0; i < s->
terms; i++) {
866 for (i = 0; i < weights; i++) {
867 t = (int8_t)bytestream2_get_byte(&gb);
873 t = (int8_t)bytestream2_get_byte(&gb);
888 for (i = s->
terms - 1; (i >= 0) && (t < size); i--) {
891 wp_exp2(bytestream2_get_le16(&gb));
893 wp_exp2(bytestream2_get_le16(&gb));
897 wp_exp2(bytestream2_get_le16(&gb));
899 wp_exp2(bytestream2_get_le16(&gb));
905 wp_exp2(bytestream2_get_le16(&gb));
907 wp_exp2(bytestream2_get_le16(&gb));
912 wp_exp2(bytestream2_get_le16(&gb));
915 wp_exp2(bytestream2_get_le16(&gb));
926 "Entropy vars size should be %i, got %i.\n",
932 for (i = 0; i < 3; i++) {
944 for (i = 0; i < (s->
stereo_in + 1); i++) {
949 for (i = 0; i < (s->
stereo_in + 1); i++) {
951 wp_exp2((int16_t)bytestream2_get_le16(&gb));
963 "Invalid INT32INFO, size = %i\n",
993 "Invalid FLOATINFO, size = %i\n", size);
1028 "Insufficient channel information\n");
1031 chan = bytestream2_get_byte(&gb);
1034 chmask = bytestream2_get_byte(&gb);
1037 chmask = bytestream2_get_le16(&gb);
1040 chmask = bytestream2_get_le24(&gb);
1043 chmask = bytestream2_get_le32(&gb);
1047 chan |= (bytestream2_get_byte(&gb) & 0xF) << 8;
1048 chmask = bytestream2_get_le16(&gb);
1062 sample_rate = bytestream2_get_le24(&gb);
1067 if (
id & WP_IDF_ODD)
1087 if (s->
hybrid && !got_hybrid) {
1102 if (size < wanted) {
1158 memcpy(samples_r, samples_l, bpp * s->
samples);
1174 int *got_frame_ptr,
AVPacket *avpkt)
1178 int buf_size = avpkt->
size;
1190 frame_flags =
AV_RL32(buf + 24);
1197 if (frame_flags & 0x80) {
1199 }
else if ((frame_flags & 0x03) <= 1) {
1206 while (buf_size > 0) {
1209 frame_size =
AV_RL32(buf + 4) - 12;
1212 if (frame_size <= 0 || frame_size > buf_size) {
1214 "Block %d has invalid size (size %d vs. %d bytes left)\n",
1215 s->
block, frame_size, buf_size);
1220 frame, buf, frame_size)) < 0) {