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
0f689a3d
Commit
0f689a3d
authored
May 18, 2013
by
Luca Barbato
Committed by
Diego Biurrun
May 18, 2013
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wavpack: K&R formatting cosmetics
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
350914fc
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
159 additions
and
126 deletions
+159
-126
wavpack.c
libavcodec/wavpack.c
+159
-126
No files found.
libavcodec/wavpack.c
View file @
0f689a3d
...
...
@@ -139,7 +139,7 @@ typedef struct WavpackContext {
}
WavpackContext
;
// exponent table copied from WavPack source
static
const
uint8_t
wp_exp2_table
[
256
]
=
{
static
const
uint8_t
wp_exp2_table
[
256
]
=
{
0x00
,
0x01
,
0x01
,
0x02
,
0x03
,
0x03
,
0x04
,
0x05
,
0x06
,
0x06
,
0x07
,
0x08
,
0x08
,
0x09
,
0x0a
,
0x0b
,
0x0b
,
0x0c
,
0x0d
,
0x0e
,
0x0e
,
0x0f
,
0x10
,
0x10
,
0x11
,
0x12
,
0x13
,
0x13
,
0x14
,
0x15
,
0x16
,
0x16
,
0x17
,
0x18
,
0x19
,
0x19
,
0x1a
,
0x1b
,
0x1c
,
0x1d
,
0x1d
,
0x1e
,
0x1f
,
0x20
,
0x20
,
0x21
,
0x22
,
0x23
,
...
...
@@ -229,7 +229,6 @@ static av_always_inline int wp_log2(int32_t val)
} \
}
static
av_always_inline
int
get_tail
(
GetBitContext
*
gb
,
int
k
)
{
int
p
,
e
,
res
;
...
...
@@ -300,7 +299,7 @@ static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb,
if
(
t
>=
2
)
{
if
(
get_bits_left
(
gb
)
<
t
-
1
)
goto
error
;
t
=
get_bits
(
gb
,
t
-
1
)
|
(
1
<<
(
t
-
1
));
t
=
get_bits
(
gb
,
t
-
1
)
|
(
1
<<
(
t
-
1
));
}
else
{
if
(
get_bits_left
(
gb
)
<
0
)
goto
error
;
...
...
@@ -403,10 +402,11 @@ static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc,
{
int
bit
;
if
(
s
->
extra_bits
){
if
(
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
);
*
crc
=
*
crc
*
9
+
(
S
&
0xffff
)
*
3
+
((
unsigned
)
S
>>
16
);
}
...
...
@@ -460,7 +460,8 @@ static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
if
(
shift
)
{
S
<<=
shift
;
if
((
s
->
float_flag
&
WV_FLT_SHIFT_ONES
)
||
(
s
->
got_extra_bits
&&
(
s
->
float_flag
&
WV_FLT_SHIFT_SAME
)
&&
(
s
->
got_extra_bits
&&
(
s
->
float_flag
&
WV_FLT_SHIFT_SAME
)
&&
get_bits1
(
&
s
->
gb_extra_bits
)))
{
S
|=
(
1
<<
shift
)
-
1
;
}
else
if
(
s
->
got_extra_bits
&&
...
...
@@ -563,8 +564,10 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb,
L2
=
L
+
((
s
->
decorr
[
i
].
weightA
*
A
+
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
(
B
&&
R
)
s
->
decorr
[
i
].
weightB
-=
((((
R
^
B
)
>>
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
;
s
->
decorr
[
i
].
samplesA
[
j
]
=
L
=
L2
;
s
->
decorr
[
i
].
samplesB
[
j
]
=
R
=
R2
;
}
else
if
(
t
==
-
1
)
{
...
...
@@ -699,7 +702,6 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb,
static
av_cold
int
wv_alloc_frame_context
(
WavpackContext
*
c
)
{
if
(
c
->
fdec_num
==
WV_MAX_FRAME_DECODERS
)
return
-
1
;
...
...
@@ -723,12 +725,12 @@ static av_cold int wavpack_decode_init(AVCodecContext *avctx)
else
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S32
;
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
;
/* 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
;
if
(
s
->
multichannel
&&
avctx
->
extradata
&&
avctx
->
extradata_size
==
2
)
{
int
ver
=
AV_RL16
(
avctx
->
extradata
);
...
...
@@ -780,7 +782,8 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s
=
wc
->
fdec
[
block_no
];
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
;
}
...
...
@@ -791,7 +794,8 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s
->
got_extra_bits
=
0
;
if
(
!
wc
->
mkv_mode
)
{
s
->
samples
=
AV_RL32
(
buf
);
buf
+=
4
;
s
->
samples
=
AV_RL32
(
buf
);
buf
+=
4
;
if
(
!
s
->
samples
)
{
*
got_frame_ptr
=
0
;
return
0
;
...
...
@@ -799,9 +803,10 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
}
else
{
s
->
samples
=
wc
->
samples
;
}
s
->
frame_flags
=
AV_RL32
(
buf
);
buf
+=
4
;
s
->
frame_flags
=
AV_RL32
(
buf
);
buf
+=
4
;
bpp
=
av_get_bytes_per_sample
(
avctx
->
sample_fmt
);
samples
=
(
uint8_t
*
)
samples
+
bpp
*
wc
->
ch_offset
;
samples
=
(
uint8_t
*
)
samples
+
bpp
*
wc
->
ch_offset
;
orig_bpp
=
((
s
->
frame_flags
&
0x03
)
+
1
)
<<
3
;
s
->
stereo
=
!
(
s
->
frame_flags
&
WV_MONO
);
...
...
@@ -810,11 +815,12 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s
->
hybrid
=
s
->
frame_flags
&
WV_HYBRID_MODE
;
s
->
hybrid_bitrate
=
s
->
frame_flags
&
WV_HYBRID_BITRATE
;
s
->
post_shift
=
bpp
*
8
-
orig_bpp
+
((
s
->
frame_flags
>>
13
)
&
0x1f
);
s
->
hybrid_maxclip
=
((
1LL
<<
(
orig_bpp
-
1
))
-
1
);
s
->
hybrid_maxclip
=
((
1LL
<<
(
orig_bpp
-
1
))
-
1
);
s
->
hybrid_minclip
=
((
-
1LL
<<
(
orig_bpp
-
1
)));
s
->
CRC
=
AV_RL32
(
buf
);
buf
+=
4
;
s
->
CRC
=
AV_RL32
(
buf
);
buf
+=
4
;
if
(
wc
->
mkv_mode
)
buf
+=
4
;
//
skip block size;
buf
+=
4
;
//
skip block size;
wc
->
ch_offset
+=
1
+
s
->
stereo
;
...
...
@@ -831,11 +837,13 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
if
(
id
&
WP_IDF_ODD
)
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
;
}
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
;
}
if
(
id
&
WP_IDF_IGNORE
)
{
...
...
@@ -893,23 +901,31 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
t
=
0
;
for
(
i
=
s
->
terms
-
1
;
(
i
>=
0
)
&&
(
t
<
size
);
i
--
)
{
if
(
s
->
decorr
[
i
].
value
>
8
)
{
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
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesA
[
1
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
if
(
s
->
stereo_in
)
{
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
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesB
[
1
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
t
+=
4
;
}
t
+=
4
;
}
else
if
(
s
->
decorr
[
i
].
value
<
0
)
{
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
].
samplesA
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
s
->
decorr
[
i
].
samplesB
[
0
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
t
+=
4
;
}
else
{
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
)
{
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
);
...
...
@@ -919,17 +935,17 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
break
;
case
WP_ID_ENTROPY
:
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
;
continue
;
}
for
(
j
=
0
;
j
<=
s
->
stereo_in
;
j
++
)
{
for
(
j
=
0
;
j
<=
s
->
stereo_in
;
j
++
)
for
(
i
=
0
;
i
<
3
;
i
++
)
{
s
->
ch
[
j
].
median
[
i
]
=
wp_exp2
(
AV_RL16
(
buf
));
buf
+=
2
;
}
}
got_entropy
=
1
;
break
;
case
WP_ID_HYBRID
:
...
...
@@ -958,7 +974,9 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
break
;
case
WP_ID_INT32INFO
:
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
;
continue
;
}
...
...
@@ -966,16 +984,15 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s
->
extra_bits
=
buf
[
0
];
else
if
(
buf
[
1
])
s
->
shift
=
buf
[
1
];
else
if
(
buf
[
2
]){
else
if
(
buf
[
2
])
{
s
->
and
=
s
->
or
=
1
;
s
->
shift
=
buf
[
2
];
}
else
if
(
buf
[
3
])
{
}
else
if
(
buf
[
3
])
{
s
->
and
=
1
;
s
->
shift
=
buf
[
3
];
}
/* original WavPack decoder forces 32-bit lossy sound to be treated
* as 24-bit one in order to have proper clipping
*/
* as 24-bit one in order to have proper clipping */
if
(
s
->
hybrid
&&
bpp
==
4
&&
s
->
post_shift
<
8
&&
s
->
shift
>
8
)
{
s
->
post_shift
+=
8
;
s
->
shift
-=
8
;
...
...
@@ -986,7 +1003,8 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
break
;
case
WP_ID_FLOATINFO
:
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
;
continue
;
}
...
...
@@ -1020,15 +1038,24 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
break
;
case
WP_ID_CHANINFO
:
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
;
}
chan
=
*
buf
++
;
switch
(
size
-
2
)
{
case
0
:
chmask
=
*
buf
;
break
;
case
1
:
chmask
=
AV_RL16
(
buf
);
break
;
case
2
:
chmask
=
AV_RL24
(
buf
);
break
;
case
3
:
chmask
=
AV_RL32
(
buf
);
break
;
case
0
:
chmask
=
*
buf
;
break
;
case
1
:
chmask
=
AV_RL16
(
buf
);
break
;
case
2
:
chmask
=
AV_RL24
(
buf
);
break
;
case
3
:
chmask
=
AV_RL32
(
buf
);
break
;
case
5
:
chan
|=
(
buf
[
1
]
&
0xF
)
<<
8
;
chmask
=
AV_RL24
(
buf
+
2
);
...
...
@@ -1040,9 +1067,10 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
chmask
=
avctx
->
channel_layout
;
}
if
(
chan
!=
avctx
->
channels
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Block reports total %d channels, "
"decoder believes it's %d channels
\n
"
,
chan
,
avctx
->
channels
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Block reports total %d channels, "
"decoder believes it's %d channels
\n
"
,
chan
,
avctx
->
channels
);
return
-
1
;
}
if
(
!
avctx
->
channel_layout
)
...
...
@@ -1119,8 +1147,8 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
return
-
1
;
if
(
s
->
stereo
&&
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S16
)
{
int16_t
*
dst
=
(
int16_t
*
)
samples
+
1
;
int16_t
*
src
=
(
int16_t
*
)
samples
;
int16_t
*
dst
=
(
int16_t
*
)
samples
+
1
;
int16_t
*
src
=
(
int16_t
*
)
samples
;
int
cnt
=
samplecount
;
while
(
cnt
--
)
{
*
dst
=
*
src
;
...
...
@@ -1128,8 +1156,8 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
dst
+=
channel_stride
;
}
}
else
if
(
s
->
stereo
&&
avctx
->
sample_fmt
==
AV_SAMPLE_FMT_S32
)
{
int32_t
*
dst
=
(
int32_t
*
)
samples
+
1
;
int32_t
*
src
=
(
int32_t
*
)
samples
;
int32_t
*
dst
=
(
int32_t
*
)
samples
+
1
;
int32_t
*
src
=
(
int32_t
*
)
samples
;
int
cnt
=
samplecount
;
while
(
cnt
--
)
{
*
dst
=
*
src
;
...
...
@@ -1137,8 +1165,8 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
dst
+=
channel_stride
;
}
}
else
if
(
s
->
stereo
)
{
float
*
dst
=
(
float
*
)
samples
+
1
;
float
*
src
=
(
float
*
)
samples
;
float
*
dst
=
(
float
*
)
samples
+
1
;
float
*
src
=
(
float
*
)
samples
;
int
cnt
=
samplecount
;
while
(
cnt
--
)
{
*
dst
=
*
src
;
...
...
@@ -1177,7 +1205,8 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
/* determine number of samples */
if
(
s
->
mkv_mode
)
{
s
->
samples
=
AV_RL32
(
buf
);
buf
+=
4
;
s
->
samples
=
AV_RL32
(
buf
);
buf
+=
4
;
frame_flags
=
AV_RL32
(
buf
);
}
else
{
if
(
s
->
multichannel
)
{
...
...
@@ -1215,16 +1244,19 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
frame_size
=
buf_size
;
}
else
{
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
{
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
;
frame_size
=
AV_RL32
(
buf
+
8
)
+
12
;
}
}
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
"
,
s
->
block
,
frame_size
,
buf_size
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Block %d has invalid size (size %d vs. %d bytes left)
\n
"
,
s
->
block
,
frame_size
,
buf_size
);
wavpack_decode_flush
(
avctx
);
return
-
1
;
}
...
...
@@ -1235,7 +1267,8 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
return
-
1
;
}
s
->
block
++
;
buf
+=
frame_size
;
buf_size
-=
frame_size
;
buf
+=
frame_size
;
buf_size
-=
frame_size
;
}
return
avpkt
->
size
;
...
...
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