Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
513c238f
Commit
513c238f
authored
Jan 02, 2012
by
Justin Ruggles
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wavpack: cosmetics: K&R pretty-printing
parent
c88d5319
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
337 additions
and
322 deletions
+337
-322
wavpack.c
libavcodec/wavpack.c
+337
-322
No files found.
libavcodec/wavpack.c
View file @
513c238f
...
@@ -18,11 +18,13 @@
...
@@ -18,11 +18,13 @@
* License along with Libav; if not, write to the Free Software
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
*/
#define BITSTREAM_READER_LE
#define BITSTREAM_READER_LE
#include "libavutil/audioconvert.h"
#include "avcodec.h"
#include "avcodec.h"
#include "get_bits.h"
#include "get_bits.h"
#include "unary.h"
#include "unary.h"
#include "libavutil/audioconvert.h"
/**
/**
* @file
* @file
...
@@ -44,14 +46,14 @@
...
@@ -44,14 +46,14 @@
#define WV_FLT_ZERO_SENT 0x08
#define WV_FLT_ZERO_SENT 0x08
#define WV_FLT_ZERO_SIGN 0x10
#define WV_FLT_ZERO_SIGN 0x10
enum
WP_ID_Flags
{
enum
WP_ID_Flags
{
WP_IDF_MASK
=
0x1F
,
WP_IDF_MASK
=
0x1F
,
WP_IDF_IGNORE
=
0x20
,
WP_IDF_IGNORE
=
0x20
,
WP_IDF_ODD
=
0x40
,
WP_IDF_ODD
=
0x40
,
WP_IDF_LONG
=
0x80
WP_IDF_LONG
=
0x80
};
};
enum
WP_ID
{
enum
WP_ID
{
WP_ID_DUMMY
=
0
,
WP_ID_DUMMY
=
0
,
WP_ID_ENCINFO
,
WP_ID_ENCINFO
,
WP_ID_DECTERMS
,
WP_ID_DECTERMS
,
...
@@ -178,7 +180,7 @@ static av_always_inline int wp_exp2(int16_t val)
...
@@ -178,7 +180,7 @@ static av_always_inline int wp_exp2(int16_t val)
{
{
int
res
,
neg
=
0
;
int
res
,
neg
=
0
;
if
(
val
<
0
)
{
if
(
val
<
0
)
{
val
=
-
val
;
val
=
-
val
;
neg
=
1
;
neg
=
1
;
}
}
...
@@ -193,13 +195,13 @@ static av_always_inline int wp_log2(int32_t val)
...
@@ -193,13 +195,13 @@ static av_always_inline int wp_log2(int32_t val)
{
{
int
bits
;
int
bits
;
if
(
!
val
)
if
(
!
val
)
return
0
;
return
0
;
if
(
val
==
1
)
if
(
val
==
1
)
return
256
;
return
256
;
val
+=
val
>>
9
;
val
+=
val
>>
9
;
bits
=
av_log2
(
val
)
+
1
;
bits
=
av_log2
(
val
)
+
1
;
if
(
bits
<
9
)
if
(
bits
<
9
)
return
(
bits
<<
8
)
+
wp_log2_table
[(
val
<<
(
9
-
bits
))
&
0xFF
];
return
(
bits
<<
8
)
+
wp_log2_table
[(
val
<<
(
9
-
bits
))
&
0xFF
];
else
else
return
(
bits
<<
8
)
+
wp_log2_table
[(
val
>>
(
bits
-
9
))
&
0xFF
];
return
(
bits
<<
8
)
+
wp_log2_table
[(
val
>>
(
bits
-
9
))
&
0xFF
];
...
@@ -209,18 +211,20 @@ static av_always_inline int wp_log2(int32_t val)
...
@@ -209,18 +211,20 @@ static av_always_inline int wp_log2(int32_t val)
// macros for manipulating median values
// macros for manipulating median values
#define GET_MED(n) ((c->median[n] >> 4) + 1)
#define GET_MED(n) ((c->median[n] >> 4) + 1)
#define DEC_MED(n) c->median[n] -= ((c->median[n] + (128
>>n) - 2) / (128>>
n)) * 2
#define DEC_MED(n) c->median[n] -= ((c->median[n] + (128
>> n) - 2) / (128 >>
n)) * 2
#define INC_MED(n) c->median[n] += ((c->median[n] + (128
>>n)) / (128>>
n)) * 5
#define INC_MED(n) c->median[n] += ((c->median[n] + (128
>> n) ) / (128 >>
n)) * 5
// macros for applying weight
// macros for applying weight
#define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
#define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
if(samples && in)
{ \
if (samples && in)
{ \
if((samples ^ in) < 0)
{ \
if ((samples ^ in) < 0)
{ \
weight -= delta; \
weight -= delta; \
if(weight < -1024) weight = -1024; \
if (weight < -1024) \
}else{ \
weight = -1024; \
} else { \
weight += delta; \
weight += delta; \
if(weight > 1024) weight = 1024; \
if (weight > 1024) \
weight = 1024; \
} \
} \
}
}
...
@@ -229,13 +233,13 @@ static av_always_inline int get_tail(GetBitContext *gb, int k)
...
@@ -229,13 +233,13 @@ static av_always_inline int get_tail(GetBitContext *gb, int k)
{
{
int
p
,
e
,
res
;
int
p
,
e
,
res
;
if
(
k
<
1
)
return
0
;
if
(
k
<
1
)
return
0
;
p
=
av_log2
(
k
);
p
=
av_log2
(
k
);
e
=
(
1
<<
(
p
+
1
))
-
k
-
1
;
e
=
(
1
<<
(
p
+
1
))
-
k
-
1
;
res
=
p
?
get_bits
(
gb
,
p
)
:
0
;
res
=
p
?
get_bits
(
gb
,
p
)
:
0
;
if
(
res
>=
e
){
if
(
res
>=
e
)
res
=
(
res
<<
1
)
-
e
+
get_bits1
(
gb
);
res
=
(
res
<<
1
)
-
e
+
get_bits1
(
gb
);
}
return
res
;
return
res
;
}
}
...
@@ -243,37 +247,38 @@ static void update_error_limit(WavpackFrameContext *ctx)
...
@@ -243,37 +247,38 @@ static void update_error_limit(WavpackFrameContext *ctx)
{
{
int
i
,
br
[
2
],
sl
[
2
];
int
i
,
br
[
2
],
sl
[
2
];
for
(
i
=
0
;
i
<=
ctx
->
stereo_in
;
i
++
)
{
for
(
i
=
0
;
i
<=
ctx
->
stereo_in
;
i
++
)
{
ctx
->
ch
[
i
].
bitrate_acc
+=
ctx
->
ch
[
i
].
bitrate_delta
;
ctx
->
ch
[
i
].
bitrate_acc
+=
ctx
->
ch
[
i
].
bitrate_delta
;
br
[
i
]
=
ctx
->
ch
[
i
].
bitrate_acc
>>
16
;
br
[
i
]
=
ctx
->
ch
[
i
].
bitrate_acc
>>
16
;
sl
[
i
]
=
LEVEL_DECAY
(
ctx
->
ch
[
i
].
slow_level
);
sl
[
i
]
=
LEVEL_DECAY
(
ctx
->
ch
[
i
].
slow_level
);
}
}
if
(
ctx
->
stereo_in
&&
ctx
->
hybrid_bitrate
)
{
if
(
ctx
->
stereo_in
&&
ctx
->
hybrid_bitrate
)
{
int
balance
=
(
sl
[
1
]
-
sl
[
0
]
+
br
[
1
]
+
1
)
>>
1
;
int
balance
=
(
sl
[
1
]
-
sl
[
0
]
+
br
[
1
]
+
1
)
>>
1
;
if
(
balance
>
br
[
0
])
{
if
(
balance
>
br
[
0
])
{
br
[
1
]
=
br
[
0
]
<<
1
;
br
[
1
]
=
br
[
0
]
<<
1
;
br
[
0
]
=
0
;
br
[
0
]
=
0
;
}
else
if
(
-
balance
>
br
[
0
])
{
}
else
if
(
-
balance
>
br
[
0
])
{
br
[
0
]
<<=
1
;
br
[
0
]
<<=
1
;
br
[
1
]
=
0
;
br
[
1
]
=
0
;
}
else
{
}
else
{
br
[
1
]
=
br
[
0
]
+
balance
;
br
[
1
]
=
br
[
0
]
+
balance
;
br
[
0
]
=
br
[
0
]
-
balance
;
br
[
0
]
=
br
[
0
]
-
balance
;
}
}
}
}
for
(
i
=
0
;
i
<=
ctx
->
stereo_in
;
i
++
)
{
for
(
i
=
0
;
i
<=
ctx
->
stereo_in
;
i
++
)
{
if
(
ctx
->
hybrid_bitrate
)
{
if
(
ctx
->
hybrid_bitrate
)
{
if
(
sl
[
i
]
-
br
[
i
]
>
-
0x100
)
if
(
sl
[
i
]
-
br
[
i
]
>
-
0x100
)
ctx
->
ch
[
i
].
error_limit
=
wp_exp2
(
sl
[
i
]
-
br
[
i
]
+
0x100
);
ctx
->
ch
[
i
].
error_limit
=
wp_exp2
(
sl
[
i
]
-
br
[
i
]
+
0x100
);
else
else
ctx
->
ch
[
i
].
error_limit
=
0
;
ctx
->
ch
[
i
].
error_limit
=
0
;
}
else
{
}
else
{
ctx
->
ch
[
i
].
error_limit
=
wp_exp2
(
br
[
i
]);
ctx
->
ch
[
i
].
error_limit
=
wp_exp2
(
br
[
i
]);
}
}
}
}
}
}
static
int
wv_get_value
(
WavpackFrameContext
*
ctx
,
GetBitContext
*
gb
,
int
channel
,
int
*
last
)
static
int
wv_get_value
(
WavpackFrameContext
*
ctx
,
GetBitContext
*
gb
,
int
channel
,
int
*
last
)
{
{
int
t
,
t2
;
int
t
,
t2
;
int
sign
,
base
,
add
,
ret
;
int
sign
,
base
,
add
,
ret
;
...
@@ -281,25 +286,26 @@ static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, int channel
...
@@ -281,25 +286,26 @@ static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, int channel
*
last
=
0
;
*
last
=
0
;
if
((
ctx
->
ch
[
0
].
median
[
0
]
<
2U
)
&&
(
ctx
->
ch
[
1
].
median
[
0
]
<
2U
)
&&
!
ctx
->
zero
&&
!
ctx
->
one
){
if
((
ctx
->
ch
[
0
].
median
[
0
]
<
2U
)
&&
(
ctx
->
ch
[
1
].
median
[
0
]
<
2U
)
&&
if
(
ctx
->
zeroes
){
!
ctx
->
zero
&&
!
ctx
->
one
)
{
if
(
ctx
->
zeroes
)
{
ctx
->
zeroes
--
;
ctx
->
zeroes
--
;
if
(
ctx
->
zeroes
)
{
if
(
ctx
->
zeroes
)
{
c
->
slow_level
-=
LEVEL_DECAY
(
c
->
slow_level
);
c
->
slow_level
-=
LEVEL_DECAY
(
c
->
slow_level
);
return
0
;
return
0
;
}
}
}
else
{
}
else
{
t
=
get_unary_0_33
(
gb
);
t
=
get_unary_0_33
(
gb
);
if
(
t
>=
2
)
{
if
(
t
>=
2
)
{
if
(
get_bits_left
(
gb
)
<
t
-
1
)
if
(
get_bits_left
(
gb
)
<
t
-
1
)
goto
error
;
goto
error
;
t
=
get_bits
(
gb
,
t
-
1
)
|
(
1
<<
(
t
-
1
));
t
=
get_bits
(
gb
,
t
-
1
)
|
(
1
<<
(
t
-
1
));
}
else
{
}
else
{
if
(
get_bits_left
(
gb
)
<
0
)
if
(
get_bits_left
(
gb
)
<
0
)
goto
error
;
goto
error
;
}
}
ctx
->
zeroes
=
t
;
ctx
->
zeroes
=
t
;
if
(
ctx
->
zeroes
)
{
if
(
ctx
->
zeroes
)
{
memset
(
ctx
->
ch
[
0
].
median
,
0
,
sizeof
(
ctx
->
ch
[
0
].
median
));
memset
(
ctx
->
ch
[
0
].
median
,
0
,
sizeof
(
ctx
->
ch
[
0
].
median
));
memset
(
ctx
->
ch
[
1
].
median
,
0
,
sizeof
(
ctx
->
ch
[
1
].
median
));
memset
(
ctx
->
ch
[
1
].
median
,
0
,
sizeof
(
ctx
->
ch
[
1
].
median
));
c
->
slow_level
-=
LEVEL_DECAY
(
c
->
slow_level
);
c
->
slow_level
-=
LEVEL_DECAY
(
c
->
slow_level
);
...
@@ -308,81 +314,81 @@ static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, int channel
...
@@ -308,81 +314,81 @@ static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, int channel
}
}
}
}
if
(
ctx
->
zero
)
{
if
(
ctx
->
zero
)
{
t
=
0
;
t
=
0
;
ctx
->
zero
=
0
;
ctx
->
zero
=
0
;
}
else
{
}
else
{
t
=
get_unary_0_33
(
gb
);
t
=
get_unary_0_33
(
gb
);
if
(
get_bits_left
(
gb
)
<
0
)
if
(
get_bits_left
(
gb
)
<
0
)
goto
error
;
goto
error
;
if
(
t
==
16
)
{
if
(
t
==
16
)
{
t2
=
get_unary_0_33
(
gb
);
t2
=
get_unary_0_33
(
gb
);
if
(
t2
<
2
)
{
if
(
t2
<
2
)
{
if
(
get_bits_left
(
gb
)
<
0
)
if
(
get_bits_left
(
gb
)
<
0
)
goto
error
;
goto
error
;
t
+=
t2
;
t
+=
t2
;
}
else
{
}
else
{
if
(
get_bits_left
(
gb
)
<
t2
-
1
)
if
(
get_bits_left
(
gb
)
<
t2
-
1
)
goto
error
;
goto
error
;
t
+=
get_bits
(
gb
,
t2
-
1
)
|
(
1
<<
(
t2
-
1
));
t
+=
get_bits
(
gb
,
t2
-
1
)
|
(
1
<<
(
t2
-
1
));
}
}
}
}
if
(
ctx
->
one
)
{
if
(
ctx
->
one
)
{
ctx
->
one
=
t
&
1
;
ctx
->
one
=
t
&
1
;
t
=
(
t
>>
1
)
+
1
;
t
=
(
t
>>
1
)
+
1
;
}
else
{
}
else
{
ctx
->
one
=
t
&
1
;
ctx
->
one
=
t
&
1
;
t
>>=
1
;
t
>>=
1
;
}
}
ctx
->
zero
=
!
ctx
->
one
;
ctx
->
zero
=
!
ctx
->
one
;
}
}
if
(
ctx
->
hybrid
&&
!
channel
)
if
(
ctx
->
hybrid
&&
!
channel
)
update_error_limit
(
ctx
);
update_error_limit
(
ctx
);
if
(
!
t
)
{
if
(
!
t
)
{
base
=
0
;
base
=
0
;
add
=
GET_MED
(
0
)
-
1
;
add
=
GET_MED
(
0
)
-
1
;
DEC_MED
(
0
);
DEC_MED
(
0
);
}
else
if
(
t
==
1
)
{
}
else
if
(
t
==
1
)
{
base
=
GET_MED
(
0
);
base
=
GET_MED
(
0
);
add
=
GET_MED
(
1
)
-
1
;
add
=
GET_MED
(
1
)
-
1
;
INC_MED
(
0
);
INC_MED
(
0
);
DEC_MED
(
1
);
DEC_MED
(
1
);
}
else
if
(
t
==
2
)
{
}
else
if
(
t
==
2
)
{
base
=
GET_MED
(
0
)
+
GET_MED
(
1
);
base
=
GET_MED
(
0
)
+
GET_MED
(
1
);
add
=
GET_MED
(
2
)
-
1
;
add
=
GET_MED
(
2
)
-
1
;
INC_MED
(
0
);
INC_MED
(
0
);
INC_MED
(
1
);
INC_MED
(
1
);
DEC_MED
(
2
);
DEC_MED
(
2
);
}
else
{
}
else
{
base
=
GET_MED
(
0
)
+
GET_MED
(
1
)
+
GET_MED
(
2
)
*
(
t
-
2
);
base
=
GET_MED
(
0
)
+
GET_MED
(
1
)
+
GET_MED
(
2
)
*
(
t
-
2
);
add
=
GET_MED
(
2
)
-
1
;
add
=
GET_MED
(
2
)
-
1
;
INC_MED
(
0
);
INC_MED
(
0
);
INC_MED
(
1
);
INC_MED
(
1
);
INC_MED
(
2
);
INC_MED
(
2
);
}
}
if
(
!
c
->
error_limit
)
{
if
(
!
c
->
error_limit
)
{
ret
=
base
+
get_tail
(
gb
,
add
);
ret
=
base
+
get_tail
(
gb
,
add
);
if
(
get_bits_left
(
gb
)
<=
0
)
if
(
get_bits_left
(
gb
)
<=
0
)
goto
error
;
goto
error
;
}
else
{
}
else
{
int
mid
=
(
base
*
2
+
add
+
1
)
>>
1
;
int
mid
=
(
base
*
2
+
add
+
1
)
>>
1
;
while
(
add
>
c
->
error_limit
)
{
while
(
add
>
c
->
error_limit
)
{
if
(
get_bits_left
(
gb
)
<=
0
)
if
(
get_bits_left
(
gb
)
<=
0
)
goto
error
;
goto
error
;
if
(
get_bits1
(
gb
))
{
if
(
get_bits1
(
gb
))
{
add
-=
(
mid
-
base
);
add
-=
(
mid
-
base
);
base
=
mid
;
base
=
mid
;
}
else
}
else
add
=
mid
-
base
-
1
;
add
=
mid
-
base
-
1
;
mid
=
(
base
*
2
+
add
+
1
)
>>
1
;
mid
=
(
base
*
2
+
add
+
1
)
>>
1
;
}
}
ret
=
mid
;
ret
=
mid
;
}
}
sign
=
get_bits1
(
gb
);
sign
=
get_bits1
(
gb
);
if
(
ctx
->
hybrid_bitrate
)
if
(
ctx
->
hybrid_bitrate
)
c
->
slow_level
+=
wp_log2
(
ret
)
-
LEVEL_DECAY
(
c
->
slow_level
);
c
->
slow_level
+=
wp_log2
(
ret
)
-
LEVEL_DECAY
(
c
->
slow_level
);
return
sign
?
~
ret
:
ret
;
return
sign
?
~
ret
:
ret
;
...
@@ -391,23 +397,24 @@ error:
...
@@ -391,23 +397,24 @@ error:
return
0
;
return
0
;
}
}
static
inline
int
wv_get_value_integer
(
WavpackFrameContext
*
s
,
uint32_t
*
crc
,
int
S
)
static
inline
int
wv_get_value_integer
(
WavpackFrameContext
*
s
,
uint32_t
*
crc
,
int
S
)
{
{
int
bit
;
int
bit
;
if
(
s
->
extra_bits
){
if
(
s
->
extra_bits
){
S
<<=
s
->
extra_bits
;
S
<<=
s
->
extra_bits
;
if
(
s
->
got_extra_bits
&&
get_bits_left
(
&
s
->
gb_extra_bits
)
>=
s
->
extra_bits
)
{
if
(
s
->
got_extra_bits
&&
get_bits_left
(
&
s
->
gb_extra_bits
)
>=
s
->
extra_bits
)
{
S
|=
get_bits
(
&
s
->
gb_extra_bits
,
s
->
extra_bits
);
S
|=
get_bits
(
&
s
->
gb_extra_bits
,
s
->
extra_bits
);
*
crc
=
*
crc
*
9
+
(
S
&
0xffff
)
*
3
+
((
unsigned
)
S
>>
16
);
*
crc
=
*
crc
*
9
+
(
S
&
0xffff
)
*
3
+
((
unsigned
)
S
>>
16
);
}
}
}
}
bit
=
(
S
&
s
->
and
)
|
s
->
or
;
bit
=
(
S
&
s
->
and
)
|
s
->
or
;
bit
=
(((
S
+
bit
)
<<
s
->
shift
)
-
bit
)
<<
s
->
post_shift
;
bit
=
(((
S
+
bit
)
<<
s
->
shift
)
-
bit
)
<<
s
->
post_shift
;
if
(
s
->
hybrid
)
if
(
s
->
hybrid
)
bit
=
av_clip
(
bit
,
-
s
->
hybrid_maxclip
-
1
,
s
->
hybrid_maxclip
);
bit
=
av_clip
(
bit
,
-
s
->
hybrid_maxclip
-
1
,
s
->
hybrid_maxclip
);
return
bit
;
return
bit
;
...
@@ -423,58 +430,58 @@ static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
...
@@ -423,58 +430,58 @@ static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
int
sign
;
int
sign
;
int
exp
=
s
->
float_max_exp
;
int
exp
=
s
->
float_max_exp
;
if
(
s
->
got_extra_bits
)
{
if
(
s
->
got_extra_bits
)
{
const
int
max_bits
=
1
+
23
+
8
+
1
;
const
int
max_bits
=
1
+
23
+
8
+
1
;
const
int
left_bits
=
get_bits_left
(
&
s
->
gb_extra_bits
);
const
int
left_bits
=
get_bits_left
(
&
s
->
gb_extra_bits
);
if
(
left_bits
+
8
*
FF_INPUT_BUFFER_PADDING_SIZE
<
max_bits
)
if
(
left_bits
+
8
*
FF_INPUT_BUFFER_PADDING_SIZE
<
max_bits
)
return
0
.
0
;
return
0
.
0
;
}
}
if
(
S
)
{
if
(
S
)
{
S
<<=
s
->
float_shift
;
S
<<=
s
->
float_shift
;
sign
=
S
<
0
;
sign
=
S
<
0
;
if
(
sign
)
if
(
sign
)
S
=
-
S
;
S
=
-
S
;
if
(
S
>=
0x1000000
)
{
if
(
S
>=
0x1000000
)
{
if
(
s
->
got_extra_bits
&&
get_bits1
(
&
s
->
gb_extra_bits
)){
if
(
s
->
got_extra_bits
&&
get_bits1
(
&
s
->
gb_extra_bits
))
S
=
get_bits
(
&
s
->
gb_extra_bits
,
23
);
S
=
get_bits
(
&
s
->
gb_extra_bits
,
23
);
}
else
{
else
S
=
0
;
S
=
0
;
}
exp
=
255
;
exp
=
255
;
}
else
if
(
exp
)
{
}
else
if
(
exp
)
{
int
shift
=
23
-
av_log2
(
S
);
int
shift
=
23
-
av_log2
(
S
);
exp
=
s
->
float_max_exp
;
exp
=
s
->
float_max_exp
;
if
(
exp
<=
shift
){
if
(
exp
<=
shift
)
shift
=
--
exp
;
shift
=
--
exp
;
}
exp
-=
shift
;
exp
-=
shift
;
if
(
shift
)
{
if
(
shift
)
{
S
<<=
shift
;
S
<<=
shift
;
if
((
s
->
float_flag
&
WV_FLT_SHIFT_ONES
)
||
if
((
s
->
float_flag
&
WV_FLT_SHIFT_ONES
)
||
(
s
->
got_extra_bits
&&
(
s
->
float_flag
&
WV_FLT_SHIFT_SAME
)
&&
get_bits1
(
&
s
->
gb_extra_bits
))
){
(
s
->
got_extra_bits
&&
(
s
->
float_flag
&
WV_FLT_SHIFT_SAME
)
&&
get_bits1
(
&
s
->
gb_extra_bits
)))
{
S
|=
(
1
<<
shift
)
-
1
;
S
|=
(
1
<<
shift
)
-
1
;
}
else
if
(
s
->
got_extra_bits
&&
(
s
->
float_flag
&
WV_FLT_SHIFT_SENT
)){
}
else
if
(
s
->
got_extra_bits
&&
(
s
->
float_flag
&
WV_FLT_SHIFT_SENT
))
{
S
|=
get_bits
(
&
s
->
gb_extra_bits
,
shift
);
S
|=
get_bits
(
&
s
->
gb_extra_bits
,
shift
);
}
}
}
}
}
else
{
}
else
{
exp
=
s
->
float_max_exp
;
exp
=
s
->
float_max_exp
;
}
}
S
&=
0x7fffff
;
S
&=
0x7fffff
;
}
else
{
}
else
{
sign
=
0
;
sign
=
0
;
exp
=
0
;
exp
=
0
;
if
(
s
->
got_extra_bits
&&
(
s
->
float_flag
&
WV_FLT_ZERO_SENT
))
{
if
(
s
->
got_extra_bits
&&
(
s
->
float_flag
&
WV_FLT_ZERO_SENT
))
{
if
(
get_bits1
(
&
s
->
gb_extra_bits
))
{
if
(
get_bits1
(
&
s
->
gb_extra_bits
))
{
S
=
get_bits
(
&
s
->
gb_extra_bits
,
23
);
S
=
get_bits
(
&
s
->
gb_extra_bits
,
23
);
if
(
s
->
float_max_exp
>=
25
)
if
(
s
->
float_max_exp
>=
25
)
exp
=
get_bits
(
&
s
->
gb_extra_bits
,
8
);
exp
=
get_bits
(
&
s
->
gb_extra_bits
,
8
);
sign
=
get_bits1
(
&
s
->
gb_extra_bits
);
sign
=
get_bits1
(
&
s
->
gb_extra_bits
);
}
else
{
}
else
{
if
(
s
->
float_flag
&
WV_FLT_ZERO_SIGN
)
if
(
s
->
float_flag
&
WV_FLT_ZERO_SIGN
)
sign
=
get_bits1
(
&
s
->
gb_extra_bits
);
sign
=
get_bits1
(
&
s
->
gb_extra_bits
);
}
}
}
}
...
@@ -492,7 +499,8 @@ static void wv_reset_saved_context(WavpackFrameContext *s)
...
@@ -492,7 +499,8 @@ static void wv_reset_saved_context(WavpackFrameContext *s)
s
->
sc
.
crc
=
s
->
extra_sc
.
crc
=
0xFFFFFFFF
;
s
->
sc
.
crc
=
s
->
extra_sc
.
crc
=
0xFFFFFFFF
;
}
}
static
inline
int
wv_unpack_stereo
(
WavpackFrameContext
*
s
,
GetBitContext
*
gb
,
void
*
dst
,
const
int
type
)
static
inline
int
wv_unpack_stereo
(
WavpackFrameContext
*
s
,
GetBitContext
*
gb
,
void
*
dst
,
const
int
type
)
{
{
int
i
,
j
,
count
=
0
;
int
i
,
j
,
count
=
0
;
int
last
,
t
;
int
last
,
t
;
...
@@ -506,69 +514,71 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, vo
...
@@ -506,69 +514,71 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, vo
const
int
channel_pad
=
s
->
avctx
->
channels
-
2
;
const
int
channel_pad
=
s
->
avctx
->
channels
-
2
;
s
->
one
=
s
->
zero
=
s
->
zeroes
=
0
;
s
->
one
=
s
->
zero
=
s
->
zeroes
=
0
;
do
{
do
{
L
=
wv_get_value
(
s
,
gb
,
0
,
&
last
);
L
=
wv_get_value
(
s
,
gb
,
0
,
&
last
);
if
(
last
)
break
;
if
(
last
)
break
;
R
=
wv_get_value
(
s
,
gb
,
1
,
&
last
);
R
=
wv_get_value
(
s
,
gb
,
1
,
&
last
);
if
(
last
)
break
;
if
(
last
)
for
(
i
=
0
;
i
<
s
->
terms
;
i
++
){
break
;
for
(
i
=
0
;
i
<
s
->
terms
;
i
++
)
{
t
=
s
->
decorr
[
i
].
value
;
t
=
s
->
decorr
[
i
].
value
;
if
(
t
>
0
)
{
if
(
t
>
0
)
{
if
(
t
>
8
)
{
if
(
t
>
8
)
{
if
(
t
&
1
)
{
if
(
t
&
1
)
{
A
=
2
*
s
->
decorr
[
i
].
samplesA
[
0
]
-
s
->
decorr
[
i
].
samplesA
[
1
];
A
=
2
*
s
->
decorr
[
i
].
samplesA
[
0
]
-
s
->
decorr
[
i
].
samplesA
[
1
];
B
=
2
*
s
->
decorr
[
i
].
samplesB
[
0
]
-
s
->
decorr
[
i
].
samplesB
[
1
];
B
=
2
*
s
->
decorr
[
i
].
samplesB
[
0
]
-
s
->
decorr
[
i
].
samplesB
[
1
];
}
else
{
}
else
{
A
=
(
3
*
s
->
decorr
[
i
].
samplesA
[
0
]
-
s
->
decorr
[
i
].
samplesA
[
1
])
>>
1
;
A
=
(
3
*
s
->
decorr
[
i
].
samplesA
[
0
]
-
s
->
decorr
[
i
].
samplesA
[
1
])
>>
1
;
B
=
(
3
*
s
->
decorr
[
i
].
samplesB
[
0
]
-
s
->
decorr
[
i
].
samplesB
[
1
])
>>
1
;
B
=
(
3
*
s
->
decorr
[
i
].
samplesB
[
0
]
-
s
->
decorr
[
i
].
samplesB
[
1
])
>>
1
;
}
}
s
->
decorr
[
i
].
samplesA
[
1
]
=
s
->
decorr
[
i
].
samplesA
[
0
];
s
->
decorr
[
i
].
samplesA
[
1
]
=
s
->
decorr
[
i
].
samplesA
[
0
];
s
->
decorr
[
i
].
samplesB
[
1
]
=
s
->
decorr
[
i
].
samplesB
[
0
];
s
->
decorr
[
i
].
samplesB
[
1
]
=
s
->
decorr
[
i
].
samplesB
[
0
];
j
=
0
;
j
=
0
;
}
else
{
}
else
{
A
=
s
->
decorr
[
i
].
samplesA
[
pos
];
A
=
s
->
decorr
[
i
].
samplesA
[
pos
];
B
=
s
->
decorr
[
i
].
samplesB
[
pos
];
B
=
s
->
decorr
[
i
].
samplesB
[
pos
];
j
=
(
pos
+
t
)
&
7
;
j
=
(
pos
+
t
)
&
7
;
}
}
if
(
type
!=
AV_SAMPLE_FMT_S16
)
{
if
(
type
!=
AV_SAMPLE_FMT_S16
)
{
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
(
int64_t
)
A
+
512
)
>>
10
);
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
(
int64_t
)
A
+
512
)
>>
10
);
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
(
int64_t
)
B
+
512
)
>>
10
);
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
(
int64_t
)
B
+
512
)
>>
10
);
}
else
{
}
else
{
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
A
+
512
)
>>
10
);
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
A
+
512
)
>>
10
);
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
B
+
512
)
>>
10
);
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
B
+
512
)
>>
10
);
}
}
if
(
A
&&
L
)
s
->
decorr
[
i
].
weightA
-=
((((
L
^
A
)
>>
30
)
&
2
)
-
1
)
*
s
->
decorr
[
i
].
delta
;
if
(
A
&&
L
)
s
->
decorr
[
i
].
weightA
-=
((((
L
^
A
)
>>
30
)
&
2
)
-
1
)
*
s
->
decorr
[
i
].
delta
;
if
(
B
&&
R
)
s
->
decorr
[
i
].
weightB
-=
((((
R
^
B
)
>>
30
)
&
2
)
-
1
)
*
s
->
decorr
[
i
].
delta
;
if
(
B
&&
R
)
s
->
decorr
[
i
].
weightB
-=
((((
R
^
B
)
>>
30
)
&
2
)
-
1
)
*
s
->
decorr
[
i
].
delta
;
s
->
decorr
[
i
].
samplesA
[
j
]
=
L
=
L2
;
s
->
decorr
[
i
].
samplesA
[
j
]
=
L
=
L2
;
s
->
decorr
[
i
].
samplesB
[
j
]
=
R
=
R2
;
s
->
decorr
[
i
].
samplesB
[
j
]
=
R
=
R2
;
}
else
if
(
t
==
-
1
)
{
}
else
if
(
t
==
-
1
)
{
if
(
type
!=
AV_SAMPLE_FMT_S16
)
if
(
type
!=
AV_SAMPLE_FMT_S16
)
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
(
int64_t
)
s
->
decorr
[
i
].
samplesA
[
0
]
+
512
)
>>
10
);
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
(
int64_t
)
s
->
decorr
[
i
].
samplesA
[
0
]
+
512
)
>>
10
);
else
else
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
s
->
decorr
[
i
].
samplesA
[
0
]
+
512
)
>>
10
);
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
s
->
decorr
[
i
].
samplesA
[
0
]
+
512
)
>>
10
);
UPDATE_WEIGHT_CLIP
(
s
->
decorr
[
i
].
weightA
,
s
->
decorr
[
i
].
delta
,
s
->
decorr
[
i
].
samplesA
[
0
],
L
);
UPDATE_WEIGHT_CLIP
(
s
->
decorr
[
i
].
weightA
,
s
->
decorr
[
i
].
delta
,
s
->
decorr
[
i
].
samplesA
[
0
],
L
);
L
=
L2
;
L
=
L2
;
if
(
type
!=
AV_SAMPLE_FMT_S16
)
if
(
type
!=
AV_SAMPLE_FMT_S16
)
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
(
int64_t
)
L2
+
512
)
>>
10
);
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
(
int64_t
)
L2
+
512
)
>>
10
);
else
else
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
L2
+
512
)
>>
10
);
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
L2
+
512
)
>>
10
);
UPDATE_WEIGHT_CLIP
(
s
->
decorr
[
i
].
weightB
,
s
->
decorr
[
i
].
delta
,
L2
,
R
);
UPDATE_WEIGHT_CLIP
(
s
->
decorr
[
i
].
weightB
,
s
->
decorr
[
i
].
delta
,
L2
,
R
);
R
=
R2
;
R
=
R2
;
s
->
decorr
[
i
].
samplesA
[
0
]
=
R
;
s
->
decorr
[
i
].
samplesA
[
0
]
=
R
;
}
else
{
}
else
{
if
(
type
!=
AV_SAMPLE_FMT_S16
)
if
(
type
!=
AV_SAMPLE_FMT_S16
)
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
(
int64_t
)
s
->
decorr
[
i
].
samplesB
[
0
]
+
512
)
>>
10
);
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
(
int64_t
)
s
->
decorr
[
i
].
samplesB
[
0
]
+
512
)
>>
10
);
else
else
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
s
->
decorr
[
i
].
samplesB
[
0
]
+
512
)
>>
10
);
R2
=
R
+
((
s
->
decorr
[
i
].
weightB
*
s
->
decorr
[
i
].
samplesB
[
0
]
+
512
)
>>
10
);
UPDATE_WEIGHT_CLIP
(
s
->
decorr
[
i
].
weightB
,
s
->
decorr
[
i
].
delta
,
s
->
decorr
[
i
].
samplesB
[
0
],
R
);
UPDATE_WEIGHT_CLIP
(
s
->
decorr
[
i
].
weightB
,
s
->
decorr
[
i
].
delta
,
s
->
decorr
[
i
].
samplesB
[
0
],
R
);
R
=
R2
;
R
=
R2
;
if
(
t
==
-
3
)
{
if
(
t
==
-
3
)
{
R2
=
s
->
decorr
[
i
].
samplesA
[
0
];
R2
=
s
->
decorr
[
i
].
samplesA
[
0
];
s
->
decorr
[
i
].
samplesA
[
0
]
=
R
;
s
->
decorr
[
i
].
samplesA
[
0
]
=
R
;
}
}
if
(
type
!=
AV_SAMPLE_FMT_S16
)
if
(
type
!=
AV_SAMPLE_FMT_S16
)
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
(
int64_t
)
R2
+
512
)
>>
10
);
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
(
int64_t
)
R2
+
512
)
>>
10
);
else
else
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
R2
+
512
)
>>
10
);
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
R2
+
512
)
>>
10
);
...
@@ -578,15 +588,15 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, vo
...
@@ -578,15 +588,15 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, vo
}
}
}
}
pos
=
(
pos
+
1
)
&
7
;
pos
=
(
pos
+
1
)
&
7
;
if
(
s
->
joint
)
if
(
s
->
joint
)
L
+=
(
R
-=
(
L
>>
1
));
L
+=
(
R
-=
(
L
>>
1
));
crc
=
(
crc
*
3
+
L
)
*
3
+
R
;
crc
=
(
crc
*
3
+
L
)
*
3
+
R
;
if
(
type
==
AV_SAMPLE_FMT_FLT
)
{
if
(
type
==
AV_SAMPLE_FMT_FLT
)
{
*
dstfl
++
=
wv_get_value_float
(
s
,
&
crc_extra_bits
,
L
);
*
dstfl
++
=
wv_get_value_float
(
s
,
&
crc_extra_bits
,
L
);
*
dstfl
++
=
wv_get_value_float
(
s
,
&
crc_extra_bits
,
R
);
*
dstfl
++
=
wv_get_value_float
(
s
,
&
crc_extra_bits
,
R
);
dstfl
+=
channel_pad
;
dstfl
+=
channel_pad
;
}
else
if
(
type
==
AV_SAMPLE_FMT_S32
)
{
}
else
if
(
type
==
AV_SAMPLE_FMT_S32
)
{
*
dst32
++
=
wv_get_value_integer
(
s
,
&
crc_extra_bits
,
L
);
*
dst32
++
=
wv_get_value_integer
(
s
,
&
crc_extra_bits
,
L
);
*
dst32
++
=
wv_get_value_integer
(
s
,
&
crc_extra_bits
,
R
);
*
dst32
++
=
wv_get_value_integer
(
s
,
&
crc_extra_bits
,
R
);
dst32
+=
channel_pad
;
dst32
+=
channel_pad
;
...
@@ -599,11 +609,11 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, vo
...
@@ -599,11 +609,11 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, vo
}
while
(
!
last
&&
count
<
s
->
samples
);
}
while
(
!
last
&&
count
<
s
->
samples
);
wv_reset_saved_context
(
s
);
wv_reset_saved_context
(
s
);
if
(
crc
!=
s
->
CRC
)
{
if
(
crc
!=
s
->
CRC
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"CRC error
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"CRC error
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
s
->
got_extra_bits
&&
crc_extra_bits
!=
s
->
crc_extra_bits
)
{
if
(
s
->
got_extra_bits
&&
crc_extra_bits
!=
s
->
crc_extra_bits
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Extra bits CRC error
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Extra bits CRC error
\n
"
);
return
-
1
;
return
-
1
;
}
}
...
@@ -611,7 +621,8 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, vo
...
@@ -611,7 +621,8 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, vo
return
count
*
2
;
return
count
*
2
;
}
}
static
inline
int
wv_unpack_mono
(
WavpackFrameContext
*
s
,
GetBitContext
*
gb
,
void
*
dst
,
const
int
type
)
static
inline
int
wv_unpack_mono
(
WavpackFrameContext
*
s
,
GetBitContext
*
gb
,
void
*
dst
,
const
int
type
)
{
{
int
i
,
j
,
count
=
0
;
int
i
,
j
,
count
=
0
;
int
last
,
t
;
int
last
,
t
;
...
@@ -625,40 +636,42 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void
...
@@ -625,40 +636,42 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void
const
int
channel_stride
=
s
->
avctx
->
channels
;
const
int
channel_stride
=
s
->
avctx
->
channels
;
s
->
one
=
s
->
zero
=
s
->
zeroes
=
0
;
s
->
one
=
s
->
zero
=
s
->
zeroes
=
0
;
do
{
do
{
T
=
wv_get_value
(
s
,
gb
,
0
,
&
last
);
T
=
wv_get_value
(
s
,
gb
,
0
,
&
last
);
S
=
0
;
S
=
0
;
if
(
last
)
break
;
if
(
last
)
for
(
i
=
0
;
i
<
s
->
terms
;
i
++
){
break
;
for
(
i
=
0
;
i
<
s
->
terms
;
i
++
)
{
t
=
s
->
decorr
[
i
].
value
;
t
=
s
->
decorr
[
i
].
value
;
if
(
t
>
8
)
{
if
(
t
>
8
)
{
if
(
t
&
1
)
if
(
t
&
1
)
A
=
2
*
s
->
decorr
[
i
].
samplesA
[
0
]
-
s
->
decorr
[
i
].
samplesA
[
1
];
A
=
2
*
s
->
decorr
[
i
].
samplesA
[
0
]
-
s
->
decorr
[
i
].
samplesA
[
1
];
else
else
A
=
(
3
*
s
->
decorr
[
i
].
samplesA
[
0
]
-
s
->
decorr
[
i
].
samplesA
[
1
])
>>
1
;
A
=
(
3
*
s
->
decorr
[
i
].
samplesA
[
0
]
-
s
->
decorr
[
i
].
samplesA
[
1
])
>>
1
;
s
->
decorr
[
i
].
samplesA
[
1
]
=
s
->
decorr
[
i
].
samplesA
[
0
];
s
->
decorr
[
i
].
samplesA
[
1
]
=
s
->
decorr
[
i
].
samplesA
[
0
];
j
=
0
;
j
=
0
;
}
else
{
}
else
{
A
=
s
->
decorr
[
i
].
samplesA
[
pos
];
A
=
s
->
decorr
[
i
].
samplesA
[
pos
];
j
=
(
pos
+
t
)
&
7
;
j
=
(
pos
+
t
)
&
7
;
}
}
if
(
type
!=
AV_SAMPLE_FMT_S16
)
if
(
type
!=
AV_SAMPLE_FMT_S16
)
S
=
T
+
((
s
->
decorr
[
i
].
weightA
*
(
int64_t
)
A
+
512
)
>>
10
);
S
=
T
+
((
s
->
decorr
[
i
].
weightA
*
(
int64_t
)
A
+
512
)
>>
10
);
else
else
S
=
T
+
((
s
->
decorr
[
i
].
weightA
*
A
+
512
)
>>
10
);
S
=
T
+
((
s
->
decorr
[
i
].
weightA
*
A
+
512
)
>>
10
);
if
(
A
&&
T
)
s
->
decorr
[
i
].
weightA
-=
((((
T
^
A
)
>>
30
)
&
2
)
-
1
)
*
s
->
decorr
[
i
].
delta
;
if
(
A
&&
T
)
s
->
decorr
[
i
].
weightA
-=
((((
T
^
A
)
>>
30
)
&
2
)
-
1
)
*
s
->
decorr
[
i
].
delta
;
s
->
decorr
[
i
].
samplesA
[
j
]
=
T
=
S
;
s
->
decorr
[
i
].
samplesA
[
j
]
=
T
=
S
;
}
}
pos
=
(
pos
+
1
)
&
7
;
pos
=
(
pos
+
1
)
&
7
;
crc
=
crc
*
3
+
S
;
crc
=
crc
*
3
+
S
;
if
(
type
==
AV_SAMPLE_FMT_FLT
)
{
if
(
type
==
AV_SAMPLE_FMT_FLT
)
{
*
dstfl
=
wv_get_value_float
(
s
,
&
crc_extra_bits
,
S
);
*
dstfl
=
wv_get_value_float
(
s
,
&
crc_extra_bits
,
S
);
dstfl
+=
channel_stride
;
dstfl
+=
channel_stride
;
}
else
if
(
type
==
AV_SAMPLE_FMT_S32
)
{
}
else
if
(
type
==
AV_SAMPLE_FMT_S32
)
{
*
dst32
=
wv_get_value_integer
(
s
,
&
crc_extra_bits
,
S
);
*
dst32
=
wv_get_value_integer
(
s
,
&
crc_extra_bits
,
S
);
dst32
+=
channel_stride
;
dst32
+=
channel_stride
;
}
else
{
}
else
{
*
dst16
=
wv_get_value_integer
(
s
,
&
crc_extra_bits
,
S
);
*
dst16
=
wv_get_value_integer
(
s
,
&
crc_extra_bits
,
S
);
dst16
+=
channel_stride
;
dst16
+=
channel_stride
;
}
}
...
@@ -666,11 +679,11 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void
...
@@ -666,11 +679,11 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void
}
while
(
!
last
&&
count
<
s
->
samples
);
}
while
(
!
last
&&
count
<
s
->
samples
);
wv_reset_saved_context
(
s
);
wv_reset_saved_context
(
s
);
if
(
crc
!=
s
->
CRC
)
{
if
(
crc
!=
s
->
CRC
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"CRC error
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"CRC error
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
s
->
got_extra_bits
&&
crc_extra_bits
!=
s
->
crc_extra_bits
)
{
if
(
s
->
got_extra_bits
&&
crc_extra_bits
!=
s
->
crc_extra_bits
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Extra bits CRC error
\n
"
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Extra bits CRC error
\n
"
);
return
-
1
;
return
-
1
;
}
}
...
@@ -681,11 +694,11 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void
...
@@ -681,11 +694,11 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void
static
av_cold
int
wv_alloc_frame_context
(
WavpackContext
*
c
)
static
av_cold
int
wv_alloc_frame_context
(
WavpackContext
*
c
)
{
{
if
(
c
->
fdec_num
==
WV_MAX_FRAME_DECODERS
)
if
(
c
->
fdec_num
==
WV_MAX_FRAME_DECODERS
)
return
-
1
;
return
-
1
;
c
->
fdec
[
c
->
fdec_num
]
=
av_mallocz
(
sizeof
(
**
c
->
fdec
));
c
->
fdec
[
c
->
fdec_num
]
=
av_mallocz
(
sizeof
(
**
c
->
fdec
));
if
(
!
c
->
fdec
[
c
->
fdec_num
])
if
(
!
c
->
fdec
[
c
->
fdec_num
])
return
-
1
;
return
-
1
;
c
->
fdec_num
++
;
c
->
fdec_num
++
;
c
->
fdec
[
c
->
fdec_num
-
1
]
->
avctx
=
c
->
avctx
;
c
->
fdec
[
c
->
fdec_num
-
1
]
->
avctx
=
c
->
avctx
;
...
@@ -699,20 +712,21 @@ static av_cold int wavpack_decode_init(AVCodecContext *avctx)
...
@@ -699,20 +712,21 @@ static av_cold int wavpack_decode_init(AVCodecContext *avctx)
WavpackContext
*
s
=
avctx
->
priv_data
;
WavpackContext
*
s
=
avctx
->
priv_data
;
s
->
avctx
=
avctx
;
s
->
avctx
=
avctx
;
if
(
avctx
->
bits_per_coded_sample
<=
16
)
if
(
avctx
->
bits_per_coded_sample
<=
16
)
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S16
;
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S16
;
else
else
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S32
;
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S32
;
if
(
avctx
->
channels
<=
2
&&
!
avctx
->
channel_layout
)
if
(
avctx
->
channels
<=
2
&&
!
avctx
->
channel_layout
)
avctx
->
channel_layout
=
(
avctx
->
channels
==
2
)
?
AV_CH_LAYOUT_STEREO
:
AV_CH_LAYOUT_MONO
;
avctx
->
channel_layout
=
(
avctx
->
channels
==
2
)
?
AV_CH_LAYOUT_STEREO
:
AV_CH_LAYOUT_MONO
;
s
->
multichannel
=
avctx
->
channels
>
2
;
s
->
multichannel
=
avctx
->
channels
>
2
;
/* lavf demuxer does not provide extradata, Matroska stores 0x403
/* lavf demuxer does not provide extradata, Matroska stores 0x403
there, use this to detect decoding mode for multichannel */
there, use this to detect decoding mode for multichannel */
s
->
mkv_mode
=
0
;
s
->
mkv_mode
=
0
;
if
(
s
->
multichannel
&&
avctx
->
extradata
&&
avctx
->
extradata_size
==
2
)
{
if
(
s
->
multichannel
&&
avctx
->
extradata
&&
avctx
->
extradata_size
==
2
)
{
int
ver
=
AV_RL16
(
avctx
->
extradata
);
int
ver
=
AV_RL16
(
avctx
->
extradata
);
if
(
ver
>=
0x402
&&
ver
<=
0x410
)
if
(
ver
>=
0x402
&&
ver
<=
0x410
)
s
->
mkv_mode
=
1
;
s
->
mkv_mode
=
1
;
}
}
...
@@ -729,7 +743,7 @@ static av_cold int wavpack_decode_end(AVCodecContext *avctx)
...
@@ -729,7 +743,7 @@ static av_cold int wavpack_decode_end(AVCodecContext *avctx)
WavpackContext
*
s
=
avctx
->
priv_data
;
WavpackContext
*
s
=
avctx
->
priv_data
;
int
i
;
int
i
;
for
(
i
=
0
;
i
<
s
->
fdec_num
;
i
++
)
for
(
i
=
0
;
i
<
s
->
fdec_num
;
i
++
)
av_freep
(
&
s
->
fdec
[
i
]);
av_freep
(
&
s
->
fdec
[
i
]);
s
->
fdec_num
=
0
;
s
->
fdec_num
=
0
;
...
@@ -744,25 +758,25 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
...
@@ -744,25 +758,25 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
WavpackFrameContext
*
s
;
WavpackFrameContext
*
s
;
void
*
samples
=
data
;
void
*
samples
=
data
;
int
samplecount
;
int
samplecount
;
int
got_terms
=
0
,
got_weights
=
0
,
got_samples
=
0
,
got_entropy
=
0
,
got_bs
=
0
,
got_float
=
0
;
int
got_terms
=
0
,
got_weights
=
0
,
got_samples
=
0
,
int
got_hybrid
=
0
;
got_entropy
=
0
,
got_bs
=
0
,
got_float
=
0
;
got_hybrid
=
0
;
const
uint8_t
*
orig_buf
=
buf
;
const
uint8_t
*
orig_buf
=
buf
;
const
uint8_t
*
buf_end
=
buf
+
buf_size
;
const
uint8_t
*
buf_end
=
buf
+
buf_size
;
int
i
,
j
,
id
,
size
,
ssize
,
weights
,
t
;
int
i
,
j
,
id
,
size
,
ssize
,
weights
,
t
;
int
bpp
,
chan
,
chmask
;
int
bpp
,
chan
,
chmask
;
if
(
buf_size
==
0
){
if
(
buf_size
==
0
)
{
*
got_frame_ptr
=
0
;
*
got_frame_ptr
=
0
;
return
0
;
return
0
;
}
}
if
(
block_no
>=
wc
->
fdec_num
&&
wv_alloc_frame_context
(
wc
)
<
0
)
{
if
(
block_no
>=
wc
->
fdec_num
&&
wv_alloc_frame_context
(
wc
)
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error creating frame decode context
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error creating frame decode context
\n
"
);
return
-
1
;
return
-
1
;
}
}
s
=
wc
->
fdec
[
block_no
];
s
=
wc
->
fdec
[
block_no
];
if
(
!
s
)
{
if
(
!
s
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Context for block %d is not present
\n
"
,
block_no
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Context for block %d is not present
\n
"
,
block_no
);
return
-
1
;
return
-
1
;
}
}
...
@@ -773,13 +787,13 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
...
@@ -773,13 +787,13 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s
->
and
=
s
->
or
=
s
->
shift
=
0
;
s
->
and
=
s
->
or
=
s
->
shift
=
0
;
s
->
got_extra_bits
=
0
;
s
->
got_extra_bits
=
0
;
if
(
!
wc
->
mkv_mode
)
{
if
(
!
wc
->
mkv_mode
)
{
s
->
samples
=
AV_RL32
(
buf
);
buf
+=
4
;
s
->
samples
=
AV_RL32
(
buf
);
buf
+=
4
;
if
(
!
s
->
samples
)
{
if
(
!
s
->
samples
)
{
*
got_frame_ptr
=
0
;
*
got_frame_ptr
=
0
;
return
0
;
return
0
;
}
}
}
else
{
}
else
{
s
->
samples
=
wc
->
samples
;
s
->
samples
=
wc
->
samples
;
}
}
s
->
frame_flags
=
AV_RL32
(
buf
);
buf
+=
4
;
s
->
frame_flags
=
AV_RL32
(
buf
);
buf
+=
4
;
...
@@ -792,46 +806,48 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
...
@@ -792,46 +806,48 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s
->
hybrid
=
s
->
frame_flags
&
WV_HYBRID_MODE
;
s
->
hybrid
=
s
->
frame_flags
&
WV_HYBRID_MODE
;
s
->
hybrid_bitrate
=
s
->
frame_flags
&
WV_HYBRID_BITRATE
;
s
->
hybrid_bitrate
=
s
->
frame_flags
&
WV_HYBRID_BITRATE
;
s
->
hybrid_maxclip
=
(
1LL
<<
((((
s
->
frame_flags
&
0x03
)
+
1
)
<<
3
)
-
1
))
-
1
;
s
->
hybrid_maxclip
=
(
1LL
<<
((((
s
->
frame_flags
&
0x03
)
+
1
)
<<
3
)
-
1
))
-
1
;
s
->
post_shift
=
8
*
(
bpp
-
1
-
(
s
->
frame_flags
&
0x03
))
+
((
s
->
frame_flags
>>
13
)
&
0x1f
);
s
->
post_shift
=
8
*
(
bpp
-
1
-
(
s
->
frame_flags
&
0x03
))
+
((
s
->
frame_flags
>>
13
)
&
0x1f
);
s
->
CRC
=
AV_RL32
(
buf
);
buf
+=
4
;
s
->
CRC
=
AV_RL32
(
buf
);
buf
+=
4
;
if
(
wc
->
mkv_mode
)
if
(
wc
->
mkv_mode
)
buf
+=
4
;
//skip block size;
buf
+=
4
;
//skip block size;
wc
->
ch_offset
+=
1
+
s
->
stereo
;
wc
->
ch_offset
+=
1
+
s
->
stereo
;
// parse metadata blocks
// parse metadata blocks
while
(
buf
<
buf_end
)
{
while
(
buf
<
buf_end
)
{
id
=
*
buf
++
;
id
=
*
buf
++
;
size
=
*
buf
++
;
size
=
*
buf
++
;
if
(
id
&
WP_IDF_LONG
)
{
if
(
id
&
WP_IDF_LONG
)
{
size
|=
(
*
buf
++
)
<<
8
;
size
|=
(
*
buf
++
)
<<
8
;
size
|=
(
*
buf
++
)
<<
16
;
size
|=
(
*
buf
++
)
<<
16
;
}
}
size
<<=
1
;
// size is specified in words
size
<<=
1
;
// size is specified in words
ssize
=
size
;
ssize
=
size
;
if
(
id
&
WP_IDF_ODD
)
size
--
;
if
(
id
&
WP_IDF_ODD
)
if
(
size
<
0
){
size
--
;
if
(
size
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Got incorrect block %02X with size %i
\n
"
,
id
,
size
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Got incorrect block %02X with size %i
\n
"
,
id
,
size
);
break
;
break
;
}
}
if
(
buf
+
ssize
>
buf_end
)
{
if
(
buf
+
ssize
>
buf_end
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Block size %i is out of bounds
\n
"
,
size
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Block size %i is out of bounds
\n
"
,
size
);
break
;
break
;
}
}
if
(
id
&
WP_IDF_IGNORE
)
{
if
(
id
&
WP_IDF_IGNORE
)
{
buf
+=
ssize
;
buf
+=
ssize
;
continue
;
continue
;
}
}
switch
(
id
&
WP_IDF_MASK
)
{
switch
(
id
&
WP_IDF_MASK
)
{
case
WP_ID_DECTERMS
:
case
WP_ID_DECTERMS
:
if
(
size
>
MAX_TERMS
)
{
if
(
size
>
MAX_TERMS
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Too many decorrelation terms
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Too many decorrelation terms
\n
"
);
s
->
terms
=
0
;
s
->
terms
=
0
;
buf
+=
ssize
;
buf
+=
ssize
;
continue
;
continue
;
}
}
s
->
terms
=
size
;
s
->
terms
=
size
;
for
(
i
=
0
;
i
<
s
->
terms
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
terms
;
i
++
)
{
s
->
decorr
[
s
->
terms
-
i
-
1
].
value
=
(
*
buf
&
0x1F
)
-
5
;
s
->
decorr
[
s
->
terms
-
i
-
1
].
value
=
(
*
buf
&
0x1F
)
-
5
;
s
->
decorr
[
s
->
terms
-
i
-
1
].
delta
=
*
buf
>>
5
;
s
->
decorr
[
s
->
terms
-
i
-
1
].
delta
=
*
buf
>>
5
;
buf
++
;
buf
++
;
...
@@ -839,70 +855,72 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
...
@@ -839,70 +855,72 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
got_terms
=
1
;
got_terms
=
1
;
break
;
break
;
case
WP_ID_DECWEIGHTS
:
case
WP_ID_DECWEIGHTS
:
if
(
!
got_terms
)
{
if
(
!
got_terms
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"No decorrelation terms met
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"No decorrelation terms met
\n
"
);
continue
;
continue
;
}
}
weights
=
size
>>
s
->
stereo_in
;
weights
=
size
>>
s
->
stereo_in
;
if
(
weights
>
MAX_TERMS
||
weights
>
s
->
terms
)
{
if
(
weights
>
MAX_TERMS
||
weights
>
s
->
terms
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Too many decorrelation weights
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Too many decorrelation weights
\n
"
);
buf
+=
ssize
;
buf
+=
ssize
;
continue
;
continue
;
}
}
for
(
i
=
0
;
i
<
weights
;
i
++
)
{
for
(
i
=
0
;
i
<
weights
;
i
++
)
{
t
=
(
int8_t
)(
*
buf
++
);
t
=
(
int8_t
)(
*
buf
++
);
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightA
=
t
<<
3
;
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightA
=
t
<<
3
;
if
(
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightA
>
0
)
if
(
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightA
>
0
)
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightA
+=
(
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightA
+
64
)
>>
7
;
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightA
+=
if
(
s
->
stereo_in
){
(
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightA
+
64
)
>>
7
;
if
(
s
->
stereo_in
)
{
t
=
(
int8_t
)(
*
buf
++
);
t
=
(
int8_t
)(
*
buf
++
);
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightB
=
t
<<
3
;
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightB
=
t
<<
3
;
if
(
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightB
>
0
)
if
(
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightB
>
0
)
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightB
+=
(
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightB
+
64
)
>>
7
;
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightB
+=
(
s
->
decorr
[
s
->
terms
-
i
-
1
].
weightB
+
64
)
>>
7
;
}
}
}
}
got_weights
=
1
;
got_weights
=
1
;
break
;
break
;
case
WP_ID_DECSAMPLES
:
case
WP_ID_DECSAMPLES
:
if
(
!
got_terms
)
{
if
(
!
got_terms
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"No decorrelation terms met
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"No decorrelation terms met
\n
"
);
continue
;
continue
;
}
}
t
=
0
;
t
=
0
;
for
(
i
=
s
->
terms
-
1
;
(
i
>=
0
)
&&
(
t
<
size
);
i
--
)
{
for
i
=
s
->
terms
-
1
;
(
i
>=
0
)
&&
(
t
<
size
);
i
--
)
{
if
(
s
->
decorr
[
i
].
value
>
8
)
{
if
(
s
->
decorr
[
i
].
value
>
8
)
{
s
->
decorr
[
i
].
samplesA
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesA
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesA
[
1
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesA
[
1
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
if
(
s
->
stereo_in
)
{
if
(
s
->
stereo_in
)
{
s
->
decorr
[
i
].
samplesB
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesB
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesB
[
1
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesB
[
1
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
t
+=
4
;
t
+=
4
;
}
}
t
+=
4
;
t
+=
4
;
}
else
if
(
s
->
decorr
[
i
].
value
<
0
)
{
}
else
if
(
s
->
decorr
[
i
].
value
<
0
)
{
s
->
decorr
[
i
].
samplesA
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesA
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesB
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesB
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
t
+=
4
;
t
+=
4
;
}
else
{
}
else
{
for
(
j
=
0
;
j
<
s
->
decorr
[
i
].
value
;
j
++
)
{
for
(
j
=
0
;
j
<
s
->
decorr
[
i
].
value
;
j
++
)
{
s
->
decorr
[
i
].
samplesA
[
j
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesA
[
j
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
if
(
s
->
stereo_in
){
if
(
s
->
stereo_in
)
s
->
decorr
[
i
].
samplesB
[
j
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesB
[
j
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
}
}
}
t
+=
s
->
decorr
[
i
].
value
*
2
*
(
s
->
stereo_in
+
1
);
t
+=
s
->
decorr
[
i
].
value
*
2
*
(
s
->
stereo_in
+
1
);
}
}
}
}
got_samples
=
1
;
got_samples
=
1
;
break
;
break
;
case
WP_ID_ENTROPY
:
case
WP_ID_ENTROPY
:
if
(
size
!=
6
*
(
s
->
stereo_in
+
1
)){
if
(
size
!=
6
*
(
s
->
stereo_in
+
1
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Entropy vars size should be %i, got %i"
,
6
*
(
s
->
stereo_in
+
1
),
size
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Entropy vars size should be %i, "
"got %i"
,
6
*
(
s
->
stereo_in
+
1
),
size
);
buf
+=
ssize
;
buf
+=
ssize
;
continue
;
continue
;
}
}
for
(
j
=
0
;
j
<=
s
->
stereo_in
;
j
++
)
{
for
(
j
=
0
;
j
<=
s
->
stereo_in
;
j
++
)
{
for
(
i
=
0
;
i
<
3
;
i
++
)
{
for
(
i
=
0
;
i
<
3
;
i
++
)
{
s
->
ch
[
j
].
median
[
i
]
=
wp_exp2
(
AV_RL16
(
buf
));
s
->
ch
[
j
].
median
[
i
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
buf
+=
2
;
}
}
...
@@ -910,50 +928,50 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
...
@@ -910,50 +928,50 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
got_entropy
=
1
;
got_entropy
=
1
;
break
;
break
;
case
WP_ID_HYBRID
:
case
WP_ID_HYBRID
:
if
(
s
->
hybrid_bitrate
)
{
if
(
s
->
hybrid_bitrate
)
{
for
(
i
=
0
;
i
<=
s
->
stereo_in
;
i
++
)
{
for
(
i
=
0
;
i
<=
s
->
stereo_in
;
i
++
)
{
s
->
ch
[
i
].
slow_level
=
wp_exp2
(
AV_RL16
(
buf
));
s
->
ch
[
i
].
slow_level
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
buf
+=
2
;
size
-=
2
;
size
-=
2
;
}
}
}
}
for
(
i
=
0
;
i
<
(
s
->
stereo_in
+
1
);
i
++
)
{
for
(
i
=
0
;
i
<
(
s
->
stereo_in
+
1
);
i
++
)
{
s
->
ch
[
i
].
bitrate_acc
=
AV_RL16
(
buf
)
<<
16
;
s
->
ch
[
i
].
bitrate_acc
=
AV_RL16
(
buf
)
<<
16
;
buf
+=
2
;
buf
+=
2
;
size
-=
2
;
size
-=
2
;
}
}
if
(
size
>
0
)
{
if
(
size
>
0
)
{
for
(
i
=
0
;
i
<
(
s
->
stereo_in
+
1
);
i
++
)
{
for
(
i
=
0
;
i
<
(
s
->
stereo_in
+
1
);
i
++
)
{
s
->
ch
[
i
].
bitrate_delta
=
wp_exp2
((
int16_t
)
AV_RL16
(
buf
));
s
->
ch
[
i
].
bitrate_delta
=
wp_exp2
((
int16_t
)
AV_RL16
(
buf
));
buf
+=
2
;
buf
+=
2
;
}
}
}
else
{
}
else
{
for
(
i
=
0
;
i
<
(
s
->
stereo_in
+
1
);
i
++
)
for
(
i
=
0
;
i
<
(
s
->
stereo_in
+
1
);
i
++
)
s
->
ch
[
i
].
bitrate_delta
=
0
;
s
->
ch
[
i
].
bitrate_delta
=
0
;
}
}
got_hybrid
=
1
;
got_hybrid
=
1
;
break
;
break
;
case
WP_ID_INT32INFO
:
case
WP_ID_INT32INFO
:
if
(
size
!=
4
)
{
if
(
size
!=
4
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid INT32INFO, size = %i, sent_bits = %i
\n
"
,
size
,
*
buf
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid INT32INFO, size = %i, sent_bits = %i
\n
"
,
size
,
*
buf
);
buf
+=
ssize
;
buf
+=
ssize
;
continue
;
continue
;
}
}
if
(
buf
[
0
])
if
(
buf
[
0
])
s
->
extra_bits
=
buf
[
0
];
s
->
extra_bits
=
buf
[
0
];
else
if
(
buf
[
1
])
else
if
(
buf
[
1
])
s
->
shift
=
buf
[
1
];
s
->
shift
=
buf
[
1
];
else
if
(
buf
[
2
]){
else
if
(
buf
[
2
]){
s
->
and
=
s
->
or
=
1
;
s
->
and
=
s
->
or
=
1
;
s
->
shift
=
buf
[
2
];
s
->
shift
=
buf
[
2
];
}
else
if
(
buf
[
3
])
{
}
else
if
(
buf
[
3
])
{
s
->
and
=
1
;
s
->
and
=
1
;
s
->
shift
=
buf
[
3
];
s
->
shift
=
buf
[
3
];
}
}
buf
+=
4
;
buf
+=
4
;
break
;
break
;
case
WP_ID_FLOATINFO
:
case
WP_ID_FLOATINFO
:
if
(
size
!=
4
)
{
if
(
size
!=
4
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid FLOATINFO, size = %i
\n
"
,
size
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid FLOATINFO, size = %i
\n
"
,
size
);
buf
+=
ssize
;
buf
+=
ssize
;
continue
;
continue
;
...
@@ -973,8 +991,9 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
...
@@ -973,8 +991,9 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
got_bs
=
1
;
got_bs
=
1
;
break
;
break
;
case
WP_ID_EXTRABITS
:
case
WP_ID_EXTRABITS
:
if
(
size
<=
4
){
if
(
size
<=
4
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid EXTRABITS, size = %i
\n
"
,
size
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid EXTRABITS, size = %i
\n
"
,
size
);
buf
+=
size
;
buf
+=
size
;
continue
;
continue
;
}
}
...
@@ -986,89 +1005,84 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
...
@@ -986,89 +1005,84 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s
->
got_extra_bits
=
1
;
s
->
got_extra_bits
=
1
;
break
;
break
;
case
WP_ID_CHANINFO
:
case
WP_ID_CHANINFO
:
if
(
size
<=
1
)
{
if
(
size
<=
1
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Insufficient channel information
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Insufficient channel information
\n
"
);
return
-
1
;
return
-
1
;
}
}
chan
=
*
buf
++
;
chan
=
*
buf
++
;
switch
(
size
-
2
){
switch
(
size
-
2
)
{
case
0
:
case
0
:
chmask
=
*
buf
;
break
;
chmask
=
*
buf
;
case
1
:
chmask
=
AV_RL16
(
buf
);
break
;
break
;
case
2
:
chmask
=
AV_RL24
(
buf
);
break
;
case
1
:
case
3
:
chmask
=
AV_RL32
(
buf
);
break
;
chmask
=
AV_RL16
(
buf
);
break
;
case
2
:
chmask
=
AV_RL24
(
buf
);
break
;
case
3
:
chmask
=
AV_RL32
(
buf
);
break
;
case
5
:
case
5
:
chan
|=
(
buf
[
1
]
&
0xF
)
<<
8
;
chan
|=
(
buf
[
1
]
&
0xF
)
<<
8
;
chmask
=
AV_RL24
(
buf
+
2
);
chmask
=
AV_RL24
(
buf
+
2
);
break
;
break
;
default:
default:
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid channel info size %d
\n
"
,
size
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid channel info size %d
\n
"
,
size
);
chan
=
avctx
->
channels
;
chan
=
avctx
->
channels
;
chmask
=
avctx
->
channel_layout
;
chmask
=
avctx
->
channel_layout
;
}
}
if
(
chan
!=
avctx
->
channels
){
if
(
chan
!=
avctx
->
channels
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Block reports total %d channels, decoder believes it's %d channels
\n
"
,
av_log
(
avctx
,
AV_LOG_ERROR
,
"Block reports total %d channels, "
chan
,
avctx
->
channels
);
"decoder believes it's %d channels
\n
"
,
chan
,
avctx
->
channels
);
return
-
1
;
return
-
1
;
}
}
if
(
!
avctx
->
channel_layout
)
if
(
!
avctx
->
channel_layout
)
avctx
->
channel_layout
=
chmask
;
avctx
->
channel_layout
=
chmask
;
buf
+=
size
-
1
;
buf
+=
size
-
1
;
break
;
break
;
default:
default:
buf
+=
size
;
buf
+=
size
;
}
}
if
(
id
&
WP_IDF_ODD
)
buf
++
;
if
(
id
&
WP_IDF_ODD
)
buf
++
;
}
}
if
(
!
got_terms
)
{
if
(
!
got_terms
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"No block with decorrelation terms
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"No block with decorrelation terms
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
!
got_weights
)
{
if
(
!
got_weights
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"No block with decorrelation weights
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"No block with decorrelation weights
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
!
got_samples
)
{
if
(
!
got_samples
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"No block with decorrelation samples
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"No block with decorrelation samples
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
!
got_entropy
)
{
if
(
!
got_entropy
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"No block with entropy info
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"No block with entropy info
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
s
->
hybrid
&&
!
got_hybrid
)
{
if
(
s
->
hybrid
&&
!
got_hybrid
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Hybrid config not found
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Hybrid config not found
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
!
got_bs
)
{
if
(
!
got_bs
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Packed samples not found
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Packed samples not found
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
!
got_float
&&
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_FLT
)
{
if
(
!
got_float
&&
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_FLT
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Float information not found
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Float information not found
\n
"
);
return
-
1
;
return
-
1
;
}
}
if
(
s
->
got_extra_bits
&&
avctx
->
sample_fmt
!=
AV_SAMPLE_FMT_FLT
)
{
if
(
s
->
got_extra_bits
&&
avctx
->
sample_fmt
!=
AV_SAMPLE_FMT_FLT
)
{
const
int
size
=
get_bits_left
(
&
s
->
gb_extra_bits
);
const
int
size
=
get_bits_left
(
&
s
->
gb_extra_bits
);
const
int
wanted
=
s
->
samples
*
s
->
extra_bits
<<
s
->
stereo_in
;
const
int
wanted
=
s
->
samples
*
s
->
extra_bits
<<
s
->
stereo_in
;
if
(
size
<
wanted
)
{
if
(
size
<
wanted
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Too small EXTRABITS
\n
"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Too small EXTRABITS
\n
"
);
s
->
got_extra_bits
=
0
;
s
->
got_extra_bits
=
0
;
}
}
}
}
if
(
s
->
stereo_in
)
{
if
(
s
->
stereo_in
)
{
if
(
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S16
)
if
(
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S16
)
samplecount
=
wv_unpack_stereo
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_S16
);
samplecount
=
wv_unpack_stereo
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_S16
);
else
if
(
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S32
)
else
if
(
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S32
)
samplecount
=
wv_unpack_stereo
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_S32
);
samplecount
=
wv_unpack_stereo
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_S32
);
else
else
samplecount
=
wv_unpack_stereo
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_FLT
);
samplecount
=
wv_unpack_stereo
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_FLT
);
...
@@ -1077,12 +1091,12 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
...
@@ -1077,12 +1091,12 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
return
-
1
;
return
-
1
;
samplecount
>>=
1
;
samplecount
>>=
1
;
}
else
{
}
else
{
const
int
channel_stride
=
avctx
->
channels
;
const
int
channel_stride
=
avctx
->
channels
;
if
(
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S16
)
if
(
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S16
)
samplecount
=
wv_unpack_mono
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_S16
);
samplecount
=
wv_unpack_mono
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_S16
);
else
if
(
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S32
)
else
if
(
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S32
)
samplecount
=
wv_unpack_mono
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_S32
);
samplecount
=
wv_unpack_mono
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_S32
);
else
else
samplecount
=
wv_unpack_mono
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_FLT
);
samplecount
=
wv_unpack_mono
(
s
,
&
s
->
gb
,
samples
,
AV_SAMPLE_FMT_FLT
);
...
@@ -1090,29 +1104,29 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
...
@@ -1090,29 +1104,29 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
if
(
samplecount
<
0
)
if
(
samplecount
<
0
)
return
-
1
;
return
-
1
;
if
(
s
->
stereo
&&
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S16
)
{
if
(
s
->
stereo
&&
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S16
)
{
int16_t
*
dst
=
(
int16_t
*
)
samples
+
1
;
int16_t
*
dst
=
(
int16_t
*
)
samples
+
1
;
int16_t
*
src
=
(
int16_t
*
)
samples
;
int16_t
*
src
=
(
int16_t
*
)
samples
;
int
cnt
=
samplecount
;
int
cnt
=
samplecount
;
while
(
cnt
--
)
{
while
(
cnt
--
)
{
*
dst
=
*
src
;
*
dst
=
*
src
;
src
+=
channel_stride
;
src
+=
channel_stride
;
dst
+=
channel_stride
;
dst
+=
channel_stride
;
}
}
}
else
if
(
s
->
stereo
&&
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S32
)
{
}
else
if
(
s
->
stereo
&&
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S32
)
{
int32_t
*
dst
=
(
int32_t
*
)
samples
+
1
;
int32_t
*
dst
=
(
int32_t
*
)
samples
+
1
;
int32_t
*
src
=
(
int32_t
*
)
samples
;
int32_t
*
src
=
(
int32_t
*
)
samples
;
int
cnt
=
samplecount
;
int
cnt
=
samplecount
;
while
(
cnt
--
)
{
while
(
cnt
--
)
{
*
dst
=
*
src
;
*
dst
=
*
src
;
src
+=
channel_stride
;
src
+=
channel_stride
;
dst
+=
channel_stride
;
dst
+=
channel_stride
;
}
}
}
else
if
(
s
->
stereo
)
{
}
else
if
(
s
->
stereo
)
{
float
*
dst
=
(
float
*
)
samples
+
1
;
float
*
dst
=
(
float
*
)
samples
+
1
;
float
*
src
=
(
float
*
)
samples
;
float
*
src
=
(
float
*
)
samples
;
int
cnt
=
samplecount
;
int
cnt
=
samplecount
;
while
(
cnt
--
)
{
while
(
cnt
--
)
{
*
dst
=
*
src
;
*
dst
=
*
src
;
src
+=
channel_stride
;
src
+=
channel_stride
;
dst
+=
channel_stride
;
dst
+=
channel_stride
;
...
@@ -1147,7 +1161,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
...
@@ -1147,7 +1161,7 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
s
->
ch_offset
=
0
;
s
->
ch_offset
=
0
;
/* determine number of samples */
/* determine number of samples */
if
(
s
->
mkv_mode
)
{
if
(
s
->
mkv_mode
)
{
s
->
samples
=
AV_RL32
(
buf
);
buf
+=
4
;
s
->
samples
=
AV_RL32
(
buf
);
buf
+=
4
;
frame_flags
=
AV_RL32
(
buf
);
frame_flags
=
AV_RL32
(
buf
);
}
else
{
}
else
{
...
@@ -1180,26 +1194,27 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
...
@@ -1180,26 +1194,27 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
return
ret
;
return
ret
;
}
}
while
(
buf_size
>
0
)
{
while
(
buf_size
>
0
)
{
if
(
!
s
->
multichannel
)
{
if
(
!
s
->
multichannel
)
{
frame_size
=
buf_size
;
frame_size
=
buf_size
;
}
else
{
}
else
{
if
(
!
s
->
mkv_mode
)
{
if
(
!
s
->
mkv_mode
)
{
frame_size
=
AV_RL32
(
buf
)
-
12
;
buf
+=
4
;
buf_size
-=
4
;
frame_size
=
AV_RL32
(
buf
)
-
12
;
buf
+=
4
;
buf_size
-=
4
;
}
else
{
}
else
{
if
(
buf_size
<
12
)
//MKV files can have zero flags after last block
if
(
buf_size
<
12
)
//MKV files can have zero flags after last block
break
;
break
;
frame_size
=
AV_RL32
(
buf
+
8
)
+
12
;
frame_size
=
AV_RL32
(
buf
+
8
)
+
12
;
}
}
}
}
if
(
frame_size
<
0
||
frame_size
>
buf_size
)
{
if
(
frame_size
<
0
||
frame_size
>
buf_size
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Block %d has invalid size (size %d
vs. %d bytes left)
\n
"
,
av_log
(
avctx
,
AV_LOG_ERROR
,
"Block %d has invalid size (size %d
"
s
->
block
,
frame_size
,
buf_size
);
"vs. %d bytes left)
\n
"
,
s
->
block
,
frame_size
,
buf_size
);
wavpack_decode_flush
(
avctx
);
wavpack_decode_flush
(
avctx
);
return
-
1
;
return
-
1
;
}
}
if
((
samplecount
=
wavpack_decode_block
(
avctx
,
s
->
block
,
s
->
frame
.
data
[
0
],
if
((
samplecount
=
wavpack_decode_block
(
avctx
,
s
->
block
,
got_frame_ptr
,
buf
,
frame_size
))
<
0
)
{
s
->
frame
.
data
[
0
],
got_frame_ptr
,
buf
,
frame_size
))
<
0
)
{
wavpack_decode_flush
(
avctx
);
wavpack_decode_flush
(
avctx
);
return
-
1
;
return
-
1
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment