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) {