22 #define BITSTREAM_READER_LE
35 #define WV_MONO 0x00000004
36 #define WV_JOINT_STEREO 0x00000010
37 #define WV_FALSE_STEREO 0x40000000
39 #define WV_HYBRID_MODE 0x00000008
40 #define WV_HYBRID_SHAPE 0x00000008
41 #define WV_HYBRID_BITRATE 0x00000200
42 #define WV_HYBRID_BALANCE 0x00000400
44 #define WV_FLT_SHIFT_ONES 0x01
45 #define WV_FLT_SHIFT_SAME 0x02
46 #define WV_FLT_SHIFT_SENT 0x04
47 #define WV_FLT_ZERO_SENT 0x08
48 #define WV_FLT_ZERO_SIGN 0x10
50 #define WV_MAX_SAMPLES 131072
128 #define WV_MAX_FRAME_DECODERS 14
146 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
147 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
148 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
149 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
150 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
151 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
152 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
153 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
154 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
155 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
156 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
157 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
158 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
159 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
160 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
161 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
165 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
166 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
167 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
168 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
169 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
170 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
171 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
172 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
173 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
174 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
175 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
176 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
177 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
178 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
179 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
180 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
194 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
195 return neg ? -res : res;
211 return (bits << 8) +
wp_log2_table[(val >> (bits - 9)) & 0xFF];
214 #define LEVEL_DECAY(a) ((a + 0x80) >> 8)
217 #define GET_MED(n) ((c->median[n] >> 4) + 1)
218 #define DEC_MED(n) c->median[n] -= ((c->median[n] + (128 >> n) - 2) / (128 >> n)) * 2
219 #define INC_MED(n) c->median[n] += ((c->median[n] + (128 >> n) ) / (128 >> n)) * 5
222 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
223 if (samples && in) { \
224 if ((samples ^ in) < 0) { \
226 if (weight < -1024) \
243 e = (1 << (p + 1)) - k - 1;
260 int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
261 if (balance > br[0]) {
264 }
else if (-balance > br[0]) {
268 br[1] = br[0] + balance;
269 br[0] = br[0] - balance;
274 if (sl[i] - br[i] > -0x100)
285 int channel,
int *last)
288 int sign, base, add, ret;
306 t =
get_bits(gb, t - 1) | (1 << (t-1));
337 t +=
get_bits(gb, t2 - 1) | (1 << (t2 - 1));
351 if (ctx->
hybrid && !channel)
381 int mid = (base * 2 + add + 1) >> 1;
389 add = mid - base - 1;
390 mid = (base * 2 + add + 1) >> 1;
397 return sign ? ~ret : ret;
414 *crc = *crc * 9 + (S & 0xffff) * 3 + ((
unsigned)S >> 16);
418 bit = (S & s->
and) | s->
or;
419 bit = ((S + bit) << s->
shift) - bit;
438 const int max_bits = 1 + 23 + 8 + 1;
450 if (S >= 0x1000000) {
468 S |= (1 <<
shift) - 1;
494 *crc = *crc * 27 + S * 9 + exp * 3 + sign;
496 value.u = (sign << 31) | (exp << 23) |
S;
507 uint32_t crc_extra_bits)
522 void *
dst,
const int type)
528 uint32_t crc = s->
sc.
crc;
530 int16_t *dst16 =
dst;
543 for (i = 0; i < s->
terms; i++) {
573 }
else if (t == -1) {
611 L += (R -= (L >> 1));
612 crc = (crc * 3 +
L) * 3 + R;
617 dstfl += channel_pad;
621 dst32 += channel_pad;
625 dst16 += channel_pad;
628 }
while (!last && count < s->
samples);
639 void *
dst,
const int type)
645 uint32_t crc = s->
sc.
crc;
647 int16_t *dst16 =
dst;
658 for (i = 0; i < s->
terms; i++) {
684 dstfl += channel_stride;
687 dst32 += channel_stride;
690 dst16 += channel_stride;
693 }
while (!last && count < s->
samples);
738 if (ver >= 0x402 && ver <= 0x410)
763 void *
data,
int *got_frame_ptr,
764 const uint8_t *buf,
int buf_size)
770 int got_terms = 0, got_weights = 0, got_samples = 0,
771 got_entropy = 0, got_bs = 0, got_float = 0, got_hybrid = 0;
773 const uint8_t *buf_end = buf + buf_size;
774 int i, j,
id,
size, ssize, weights,
t;
775 int bpp, chan, chmask, orig_bpp;
787 s = wc->
fdec[block_no];
799 memset(s->
ch, 0,
sizeof(s->
ch));
837 while (buf < buf_end) {
841 size |= (*buf++) << 8;
842 size |= (*buf++) << 16;
852 if (buf + ssize > buf_end) {
869 for (i = 0; i < s->
terms; i++) {
887 for (i = 0; i < weights; i++) {
888 t = (int8_t)(*buf++);
894 t = (int8_t)(*buf++);
909 for (i = s->
terms - 1; (i >= 0) && (t < size); i--) {
943 for (i = 0; i < 3; i++) {
958 for (i = 0; i < (s->
stereo_in + 1); i++) {
964 for (i = 0; i < (s->
stereo_in + 1); i++) {
976 av_log(avctx,
AV_LOG_ERROR,
"Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf);
1043 case 0: chmask = *buf;
break;
1044 case 1: chmask =
AV_RL16(buf);
break;
1045 case 2: chmask =
AV_RL24(buf);
break;
1046 case 3: chmask =
AV_RL32(buf);
break;
1048 chan |= (buf[1] & 0xF) << 8;
1059 "decoder believes it's %d channels\n", chan,
1070 if (
id & WP_IDF_ODD)
1090 if (s->
hybrid && !got_hybrid) {
1105 if (size < wanted) {
1119 if (samplecount < 0)
1124 const int channel_stride = avctx->
channels;
1133 if (samplecount < 0)
1137 int16_t *
dst = (int16_t*)samples + 1;
1138 int16_t *src = (int16_t*)samples;
1139 int cnt = samplecount;
1142 src += channel_stride;
1143 dst += channel_stride;
1148 int cnt = samplecount;
1151 src += channel_stride;
1152 dst += channel_stride;
1155 float *
dst = (
float*)samples + 1;
1156 float *src = (
float*)samples;
1157 int cnt = samplecount;
1160 src += channel_stride;
1161 dst += channel_stride;
1168 return samplecount * bpp;
1181 int *got_frame_ptr,
AVPacket *avpkt)
1185 int buf_size = avpkt->
size;
1187 int samplecount = 0;
1199 frame_flags =
AV_RL32(buf + 8);
1202 frame_flags =
AV_RL32(buf + 4);
1211 if (frame_flags & 0x80) {
1213 }
else if ((frame_flags & 0x03) <= 1) {
1228 while (buf_size > 0) {
1230 frame_size = buf_size;
1233 frame_size =
AV_RL32(buf) - 12; buf += 4; buf_size -= 4;
1237 frame_size =
AV_RL32(buf + 8) + 12;
1240 if (frame_size < 0 || frame_size > buf_size) {
1242 "vs. %d bytes left)\n", s->
block, frame_size, buf_size);
1248 buf, frame_size)) < 0) {