annotate wavpack.c @ 5757:ace63c809071 libavcodec

Remove uses of SIGILL for CPU extension detection, that method is not acceptable in a library. Should not change anything for PPC, the autodetection is currently pointless due to other code being compiled with -maltivec as well (and detection for OSX and AmigaOS remains in place). SPARC binaries built with VIS support can now only run on systems with VIS.
author reimar
date Tue, 02 Oct 2007 18:18:35 +0000
parents 5b80d560cdca
children d030978bcd93
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"
5605
d92fa6e5fc8c move get_unary() to its own file
aurel
parents: 5539
diff changeset
24 #include "unary.h"
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
25
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
26 /**
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
27 * @file wavpack.c
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
28 * WavPack lossless audio decoder
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
29 */
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
30
5538
33a32de3c1bc Rename flag for consistency with the next commit
kostya
parents: 5510
diff changeset
31 #define WV_JOINT_STEREO 0x00000010
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
32 #define WV_FALSE_STEREO 0x40000000
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
33
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
34 enum WP_ID_Flags{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
35 WP_IDF_MASK = 0x1F,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
36 WP_IDF_IGNORE = 0x20,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
37 WP_IDF_ODD = 0x40,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
38 WP_IDF_LONG = 0x80
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
39 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
40
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
41 enum WP_ID{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
42 WP_ID_DUMMY = 0,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
43 WP_ID_ENCINFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
44 WP_ID_DECTERMS,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
45 WP_ID_DECWEIGHTS,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
46 WP_ID_DECSAMPLES,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
47 WP_ID_ENTROPY,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
48 WP_ID_HYBRID,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
49 WP_ID_SHAPING,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
50 WP_ID_FLOATINFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
51 WP_ID_INT32INFO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
52 WP_ID_DATA,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
53 WP_ID_CORR,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
54 WP_ID_FLT,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
55 WP_ID_CHANINFO
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
56 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
57
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
58 #define MAX_TERMS 16
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
59
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
60 typedef struct Decorr {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
61 int delta;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
62 int value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
63 int weightA;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
64 int weightB;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
65 int samplesA[8];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
66 int samplesB[8];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
67 } Decorr;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
68
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
69 typedef struct WavpackContext {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
70 AVCodecContext *avctx;
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
71 int stereo, stereo_in;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
72 int joint;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
73 uint32_t CRC;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
74 GetBitContext gb;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
75 int data_size; // in bits
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
76 int samples;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
77 int median[6];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
78 int terms;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
79 Decorr decorr[MAX_TERMS];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
80 int zero, one, zeroes;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
81 int and, or, shift;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
82 } WavpackContext;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
83
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
84 // exponent table copied from WavPack source
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
85 static const uint8_t wp_exp2_table [256] = {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
86 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
87 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
88 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
89 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
90 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
91 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
92 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
93 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
94 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
95 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
96 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
97 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
98 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
99 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
100 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
101 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
102 };
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
103
4283
d6f83e2f8804 rename always_inline to av_always_inline and move to common.h
mru
parents: 4021
diff changeset
104 static av_always_inline int wp_exp2(int16_t val)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
105 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
106 int res, neg = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
107
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
108 if(val < 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
109 val = -val;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
110 neg = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
111 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
112
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
113 res = wp_exp2_table[val & 0xFF] | 0x100;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
114 val >>= 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
115 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
116 return neg ? -res : res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
117 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
118
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
119 // macros for manipulating median values
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
120 #define GET_MED(n) ((median[n] >> 4) + 1)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
121 #define DEC_MED(n) median[n] -= ((median[n] + (128>>n) - 2) / (128>>n)) * 2
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
122 #define INC_MED(n) median[n] += ((median[n] + (128>>n)) / (128>>n)) * 5
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
123
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
124 // macros for applying weight
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
125 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
126 if(samples && in){ \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
127 if((samples ^ in) < 0){ \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
128 weight -= delta; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
129 if(weight < -1024) weight = -1024; \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
130 }else{ \
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 } \
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
134 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
135
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
136
4283
d6f83e2f8804 rename always_inline to av_always_inline and move to common.h
mru
parents: 4021
diff changeset
137 static av_always_inline int get_tail(GetBitContext *gb, int k)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
138 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
139 int p, e, res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
140
4421
41ee67dd4bef Coded residual in WavPack may be > 0xFFFF
kostya
parents: 4364
diff changeset
141 if(k<1)return 0;
41ee67dd4bef Coded residual in WavPack may be > 0xFFFF
kostya
parents: 4364
diff changeset
142 p = av_log2(k);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
143 e = (1 << (p + 1)) - k - 1;
3782
a8b80c80494b Handle case of get_bits(0)
kostya
parents: 3764
diff changeset
144 res = p ? get_bits(gb, p) : 0;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
145 if(res >= e){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
146 res = (res<<1) - e + get_bits1(gb);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
147 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
148 return res;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
149 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
150
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
151 static int wv_get_value(WavpackContext *ctx, GetBitContext *gb, int *median, int *last)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
152 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
153 int t, t2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
154 int sign, base, add, ret;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
155
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
156 *last = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
157
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
158 if((ctx->median[0] < 2U) && (ctx->median[3] < 2U) && !ctx->zero && !ctx->one){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
159 if(ctx->zeroes){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
160 ctx->zeroes--;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
161 if(ctx->zeroes)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
162 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
163 }else{
5607
5b80d560cdca add get_unary_0_33() to help gcc with inlining
aurel
parents: 5605
diff changeset
164 t = get_unary_0_33(gb);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
165 if(t >= 2) t = get_bits(gb, t - 1) | (1 << (t-1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
166 ctx->zeroes = t;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
167 if(ctx->zeroes){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
168 memset(ctx->median, 0, sizeof(ctx->median));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
169 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
170 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
171 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
172 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
173
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
174 if(get_bits_count(gb) >= ctx->data_size){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
175 *last = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
176 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
177 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
178
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
179 if(ctx->zero){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
180 t = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
181 ctx->zero = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
182 }else{
5607
5b80d560cdca add get_unary_0_33() to help gcc with inlining
aurel
parents: 5605
diff changeset
183 t = get_unary_0_33(gb);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
184 if(get_bits_count(gb) >= ctx->data_size){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
185 *last = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
186 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
187 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
188 if(t == 16) {
5607
5b80d560cdca add get_unary_0_33() to help gcc with inlining
aurel
parents: 5605
diff changeset
189 t2 = get_unary_0_33(gb);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
190 if(t2 < 2) t += t2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
191 else t += get_bits(gb, t2 - 1) | (1 << (t2 - 1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
192 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
193
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
194 if(ctx->one){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
195 ctx->one = t&1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
196 t = (t>>1) + 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
197 }else{
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 >>= 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
200 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
201 ctx->zero = !ctx->one;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
202 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
203
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
204 if(!t){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
205 base = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
206 add = GET_MED(0) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
207 DEC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
208 }else if(t == 1){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
209 base = GET_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
210 add = GET_MED(1) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
211 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
212 DEC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
213 }else if(t == 2){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
214 base = GET_MED(0) + GET_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
215 add = GET_MED(2) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
216 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
217 INC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
218 DEC_MED(2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
219 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
220 base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
221 add = GET_MED(2) - 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
222 INC_MED(0);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
223 INC_MED(1);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
224 INC_MED(2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
225 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
226 ret = base + get_tail(gb, add);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
227 sign = get_bits1(gb);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
228 return sign ? ~ret : ret;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
229 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
230
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
231 static int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, int16_t *dst)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
232 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
233 int i, j, count = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
234 int last, t;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
235 int A, B, L, L2, R, R2, bit;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
236 int pos = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
237 uint32_t crc = 0xFFFFFFFF;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
238
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
239 s->one = s->zero = s->zeroes = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
240 do{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
241 L = wv_get_value(s, gb, s->median, &last);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
242 if(last) break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
243 R = wv_get_value(s, gb, s->median + 3, &last);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
244 if(last) break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
245 for(i = 0; i < s->terms; i++){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
246 t = s->decorr[i].value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
247 j = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
248 if(t > 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
249 if(t > 8){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
250 if(t & 1){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
251 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
252 B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
253 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
254 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
255 B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
256 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
257 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
258 s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
259 j = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
260 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
261 A = s->decorr[i].samplesA[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
262 B = s->decorr[i].samplesB[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
263 j = (pos + t) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
264 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
265 L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
266 R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
267 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
268 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
269 s->decorr[i].samplesA[j] = L = L2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
270 s->decorr[i].samplesB[j] = R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
271 }else if(t == -1){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
272 L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
273 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
274 L = L2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
275 R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
276 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
277 R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
278 s->decorr[i].samplesA[0] = R;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
279 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
280 R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
281 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
282 R = R2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
283
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
284 if(t == -3){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
285 R2 = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
286 s->decorr[i].samplesA[0] = R;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
287 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
288
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
289 L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
290 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
291 L = L2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
292 s->decorr[i].samplesB[0] = L;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
293 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
294 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
295 pos = (pos + 1) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
296 if(s->joint)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
297 L += (R -= (L >> 1));
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
298 crc = (crc * 3 + L) * 3 + R;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
299 bit = (L & s->and) | s->or;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
300 *dst++ = ((L + bit) << s->shift) - bit;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
301 bit = (R & s->and) | s->or;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
302 *dst++ = ((R + bit) << s->shift) - bit;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
303 count++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
304 }while(!last && count < s->samples);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
305
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
306 if(crc != s->CRC){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
307 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
308 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
309 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
310 return count * 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
311 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
312
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
313 static int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, int16_t *dst)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
314 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
315 int i, j, count = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
316 int last, t;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
317 int A, S, T, bit;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
318 int pos = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
319 uint32_t crc = 0xFFFFFFFF;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
320
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
321 s->one = s->zero = s->zeroes = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
322 do{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
323 T = wv_get_value(s, gb, s->median, &last);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
324 S = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
325 if(last) break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
326 for(i = 0; i < s->terms; i++){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
327 t = s->decorr[i].value;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
328 if(t > 8){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
329 if(t & 1)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
330 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
331 else
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
332 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
333 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
334 j = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
335 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
336 A = s->decorr[i].samplesA[pos];
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
337 j = (pos + t) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
338 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
339 S = T + ((s->decorr[i].weightA * A + 512) >> 10);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
340 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
341 s->decorr[i].samplesA[j] = T = S;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
342 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
343 pos = (pos + 1) & 7;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
344 crc = crc * 3 + S;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
345 bit = (S & s->and) | s->or;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
346 *dst++ = ((S + bit) << s->shift) - bit;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
347 count++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
348 }while(!last && count < s->samples);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
349
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
350 if(crc != s->CRC){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
351 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
352 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
353 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
354 return count;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
355 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
356
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
357 static int wavpack_decode_init(AVCodecContext *avctx)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
358 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
359 WavpackContext *s = avctx->priv_data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
360
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
361 s->avctx = avctx;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
362 s->stereo = (avctx->channels == 2);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
363
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
364 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
365 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
366
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
367 static int wavpack_decode_close(AVCodecContext *avctx)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
368 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
369 // WavpackContext *s = avctx->priv_data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
370
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
371 return 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
372 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
373
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
374 static int wavpack_decode_frame(AVCodecContext *avctx,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
375 void *data, int *data_size,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
376 uint8_t *buf, int buf_size)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
377 {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
378 WavpackContext *s = avctx->priv_data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
379 int16_t *samples = data;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
380 int samplecount;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
381 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
382 uint8_t* buf_end = buf + buf_size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
383 int i, j, id, size, ssize, weights, t;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
384
4690
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
385 if (buf_size == 0){
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
386 *data_size = 0;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
387 return 0;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
388 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
389
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
390 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
391 memset(s->median, 0, sizeof(s->median));
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
392 s->and = s->or = s->shift = 0;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
393
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
394 s->samples = AV_RL32(buf); buf += 4;
4690
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
395 if(!s->samples){
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
396 *data_size = 0;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
397 return buf_size;
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
398 }
4017
b1a1fb651bf5 Move block size check to decoder
kostya
parents: 3947
diff changeset
399 /* should not happen but who knows */
4690
1bfdcac74275 Correctly handle data_size on decoding
kostya
parents: 4421
diff changeset
400 if(s->samples * 2 * avctx->channels > *data_size){
4017
b1a1fb651bf5 Move block size check to decoder
kostya
parents: 3947
diff changeset
401 av_log(avctx, AV_LOG_ERROR, "Packet size is too big to be handled in lavc!\n");
b1a1fb651bf5 Move block size check to decoder
kostya
parents: 3947
diff changeset
402 return -1;
b1a1fb651bf5 Move block size check to decoder
kostya
parents: 3947
diff changeset
403 }
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
404 s->stereo_in = (AV_RL32(buf) & WV_FALSE_STEREO) ? 0 : s->stereo;
5538
33a32de3c1bc Rename flag for consistency with the next commit
kostya
parents: 5510
diff changeset
405 s->joint = AV_RL32(buf) & WV_JOINT_STEREO; buf += 4;
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
406 s->CRC = AV_RL32(buf); buf += 4;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
407 // parse metadata blocks
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
408 while(buf < buf_end){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
409 id = *buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
410 size = *buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
411 if(id & WP_IDF_LONG) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
412 size |= (*buf++) << 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
413 size |= (*buf++) << 16;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
414 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
415 size <<= 1; // size is specified in words
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
416 ssize = size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
417 if(id & WP_IDF_ODD) size--;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
418 if(size < 0){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
419 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
420 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
421 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
422 if(buf + ssize > buf_end){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
423 av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
424 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
425 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
426 if(id & WP_IDF_IGNORE){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
427 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
428 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
429 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
430 switch(id & WP_IDF_MASK){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
431 case WP_ID_DECTERMS:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
432 s->terms = size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
433 if(s->terms > MAX_TERMS){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
434 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
435 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
436 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
437 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
438 for(i = 0; i < s->terms; i++) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
439 s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
440 s->decorr[s->terms - i - 1].delta = *buf >> 5;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
441 buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
442 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
443 got_terms = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
444 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
445 case WP_ID_DECWEIGHTS:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
446 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
447 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
448 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
449 }
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
450 weights = size >> s->stereo_in;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
451 if(weights > MAX_TERMS || weights > s->terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
452 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
453 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
454 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
455 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
456 for(i = 0; i < weights; i++) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
457 t = (int8_t)(*buf++);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
458 s->decorr[s->terms - i - 1].weightA = t << 3;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
459 if(s->decorr[s->terms - i - 1].weightA > 0)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
460 s->decorr[s->terms - i - 1].weightA += (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
461 if(s->stereo_in){
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
462 t = (int8_t)(*buf++);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
463 s->decorr[s->terms - i - 1].weightB = t << 3;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
464 if(s->decorr[s->terms - i - 1].weightB > 0)
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
465 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
466 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
467 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
468 got_weights = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
469 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
470 case WP_ID_DECSAMPLES:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
471 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
472 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
473 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
474 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
475 t = 0;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
476 for(i = s->terms - 1; (i >= 0) && (t < size); i--) {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
477 if(s->decorr[i].value > 8){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
478 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
479 s->decorr[i].samplesA[1] = wp_exp2(AV_RL16(buf)); buf += 2;
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
480 if(s->stereo_in){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
481 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
482 s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); buf += 2;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
483 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
484 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
485 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
486 }else if(s->decorr[i].value < 0){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
487 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
488 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
489 t += 4;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
490 }else{
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
491 for(j = 0; j < s->decorr[i].value; j++){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
492 s->decorr[i].samplesA[j] = wp_exp2(AV_RL16(buf)); buf += 2;
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
493 if(s->stereo_in){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
494 s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); buf += 2;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
495 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
496 }
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
497 t += s->decorr[i].value * 2 * (s->stereo_in + 1);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
498 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
499 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
500 got_samples = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
501 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
502 case WP_ID_ENTROPY:
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
503 if(size != 6 * (s->stereo_in + 1)){
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
504 av_log(avctx, AV_LOG_ERROR, "Entropy vars size should be %i, got %i", 6 * (s->stereo_in + 1), size);
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
505 buf += ssize;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
506 continue;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
507 }
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
508 for(i = 0; i < 3 * (s->stereo_in + 1); i++){
4364
05e932ddaaa9 rename BE/LE_8/16/32 to AV_RL/B_8/16/32
alex
parents: 4283
diff changeset
509 s->median[i] = wp_exp2(AV_RL16(buf));
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
510 buf += 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
511 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
512 got_entropy = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
513 break;
5482
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
514 case WP_ID_INT32INFO:
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
515 if(size != 4 || *buf){
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
516 av_log(avctx, AV_LOG_ERROR, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf);
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
517 buf += ssize;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
518 continue;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
519 }
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
520 if(buf[1])
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
521 s->shift = buf[1];
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
522 else if(buf[2]){
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
523 s->and = s->or = 1;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
524 s->shift = buf[2];
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
525 }else if(buf[3]){
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
526 s->and = 1;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
527 s->shift = buf[3];
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
528 }
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
529 buf += 4;
bba203d5c5e7 Add the handling of the INT32INFO block to the WavPack decoder.
kostya
parents: 4690
diff changeset
530 break;
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
531 case WP_ID_DATA:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
532 init_get_bits(&s->gb, buf, size * 8);
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
533 s->data_size = size * 8;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
534 buf += size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
535 got_bs = 1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
536 break;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
537 default:
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
538 buf += size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
539 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
540 if(id & WP_IDF_ODD) buf++;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
541 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
542 if(!got_terms){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
543 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
544 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
545 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
546 if(!got_weights){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
547 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
548 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
549 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
550 if(!got_samples){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
551 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
552 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
553 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
554 if(!got_entropy){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
555 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
556 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
557 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
558 if(!got_bs){
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
559 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
560 return -1;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
561 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
562
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
563 if(s->stereo_in)
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
564 samplecount = wv_unpack_stereo(s, &s->gb, samples);
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
565 else{
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
566 samplecount = wv_unpack_mono(s, &s->gb, samples);
5539
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
567 if(s->stereo){
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
568 int16_t *dst = samples + samplecount * 2;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
569 int16_t *src = samples + samplecount;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
570 int cnt = samplecount;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
571 while(cnt--){
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
572 *--dst = *--src;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
573 *--dst = *src;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
574 }
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
575 samplecount *= 2;
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
576 }
1c67999f81c8 Support for WavPack version 0x410 (false stereo chunks)
kostya
parents: 5538
diff changeset
577 }
3764
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
578 *data_size = samplecount * 2;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
579
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
580 return buf_size;
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
581 }
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
582
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
583 AVCodec wavpack_decoder = {
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
584 "wavpack",
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
585 CODEC_TYPE_AUDIO,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
586 CODEC_ID_WAVPACK,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
587 sizeof(WavpackContext),
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
588 wavpack_decode_init,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
589 NULL,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
590 wavpack_decode_close,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
591 wavpack_decode_frame,
6e7dc8fa5f70 WavPack lossless audio decoder
kostya
parents:
diff changeset
592 };