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
bfea054a
Commit
bfea054a
authored
Jan 04, 2020
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec/dca_lbr: Fix some error codes and error passing
Signed-off-by:
Michael Niedermayer
<
michael@niedermayer.cc
>
parent
94ac2c75
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
93 additions
and
69 deletions
+93
-69
dca_lbr.c
libavcodec/dca_lbr.c
+93
-69
No files found.
libavcodec/dca_lbr.c
View file @
bfea054a
...
...
@@ -154,7 +154,7 @@ static int parse_lfe_24(DCALbrDecoder *s)
step_i
=
get_bits
(
&
s
->
gb
,
8
);
if
(
step_i
>
step_max
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid LFE step size index
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
step
=
ff_dca_lfe_step_size_24
[
step_i
];
...
...
@@ -208,7 +208,7 @@ static int parse_lfe_16(DCALbrDecoder *s)
step_i
=
get_bits
(
&
s
->
gb
,
8
);
if
(
step_i
>
step_max
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid LFE step size index
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
step
=
ff_dca_lfe_step_size_16
[
step_i
];
...
...
@@ -246,14 +246,17 @@ static int parse_lfe_16(DCALbrDecoder *s)
static
int
parse_lfe_chunk
(
DCALbrDecoder
*
s
,
LBRChunk
*
chunk
)
{
int
ret
;
if
(
!
(
s
->
flags
&
LBR_FLAG_LFE_PRESENT
))
return
0
;
if
(
!
chunk
->
len
)
return
0
;
if
(
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
)
<
0
)
return
-
1
;
ret
=
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
);
if
(
ret
<
0
)
return
ret
;
// Determine bit depth from chunk size
if
(
chunk
->
len
>=
52
)
...
...
@@ -262,7 +265,7 @@ static int parse_lfe_chunk(DCALbrDecoder *s, LBRChunk *chunk)
return
parse_lfe_16
(
s
);
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"LFE chunk too short
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
static
inline
int
parse_vlc
(
GetBitContext
*
s
,
VLC
*
vlc
,
int
max_depth
)
...
...
@@ -291,13 +294,13 @@ static int parse_tonal(DCALbrDecoder *s, int group)
for
(
freq
=
1
;;
freq
++
)
{
if
(
get_bits_left
(
&
s
->
gb
)
<
1
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Tonal group chunk too short
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
diff
=
parse_vlc
(
&
s
->
gb
,
&
ff_dca_vlc_tnl_grp
[
group
],
2
);
if
(
diff
>=
FF_ARRAY_ELEMS
(
ff_dca_fst_amp
))
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid tonal frequency diff
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
diff
=
get_bitsz
(
&
s
->
gb
,
diff
>>
2
)
+
ff_dca_fst_amp
[
diff
];
...
...
@@ -307,7 +310,7 @@ static int parse_tonal(DCALbrDecoder *s, int group)
freq
+=
diff
-
2
;
if
(
freq
>>
(
5
-
group
)
>
s
->
nsubbands
*
4
-
6
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid spectral line offset
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
// Main channel
...
...
@@ -358,19 +361,21 @@ static int parse_tonal(DCALbrDecoder *s, int group)
static
int
parse_tonal_chunk
(
DCALbrDecoder
*
s
,
LBRChunk
*
chunk
)
{
int
sb
,
group
;
int
sb
,
group
,
ret
;
if
(
!
chunk
->
len
)
return
0
;
if
(
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
)
<
0
)
return
-
1
;
ret
=
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
);
if
(
ret
<
0
)
return
ret
;
// Scale factors
if
(
chunk
->
id
==
LBR_CHUNK_SCF
||
chunk
->
id
==
LBR_CHUNK_TONAL_SCF
)
{
if
(
get_bits_left
(
&
s
->
gb
)
<
36
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Tonal scale factor chunk too short
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
for
(
sb
=
0
;
sb
<
6
;
sb
++
)
s
->
tonal_scf
[
sb
]
=
get_bits
(
&
s
->
gb
,
6
);
...
...
@@ -378,20 +383,25 @@ static int parse_tonal_chunk(DCALbrDecoder *s, LBRChunk *chunk)
// Tonal groups
if
(
chunk
->
id
==
LBR_CHUNK_TONAL
||
chunk
->
id
==
LBR_CHUNK_TONAL_SCF
)
for
(
group
=
0
;
group
<
5
;
group
++
)
if
(
parse_tonal
(
s
,
group
)
<
0
)
return
-
1
;
for
(
group
=
0
;
group
<
5
;
group
++
)
{
ret
=
parse_tonal
(
s
,
group
);
if
(
ret
<
0
)
return
ret
;
}
return
0
;
}
static
int
parse_tonal_group
(
DCALbrDecoder
*
s
,
LBRChunk
*
chunk
)
{
int
ret
;
if
(
!
chunk
->
len
)
return
0
;
if
(
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
)
<
0
)
return
-
1
;
ret
=
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
);
if
(
ret
<
0
)
return
ret
;
return
parse_tonal
(
s
,
chunk
->
id
);
}
...
...
@@ -404,7 +414,7 @@ static int ensure_bits(GetBitContext *s, int n)
{
int
left
=
get_bits_left
(
s
);
if
(
left
<
0
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
left
<
n
)
{
skip_bits_long
(
s
,
left
);
return
1
;
...
...
@@ -433,7 +443,7 @@ static int parse_scale_factors(DCALbrDecoder *s, uint8_t *scf)
dist
=
parse_vlc
(
&
s
->
gb
,
&
ff_dca_vlc_rsd_apprx
,
1
)
+
1
;
if
(
dist
>
7
-
sf
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"Invalid scale factor distance
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
ensure_bits
(
&
s
->
gb
,
20
))
...
...
@@ -498,22 +508,26 @@ static int parse_st_code(GetBitContext *s, int min_v)
static
int
parse_grid_1_chunk
(
DCALbrDecoder
*
s
,
LBRChunk
*
chunk
,
int
ch1
,
int
ch2
)
{
int
ch
,
sb
,
sf
,
nsubbands
;
int
ch
,
sb
,
sf
,
nsubbands
,
ret
;
if
(
!
chunk
->
len
)
return
0
;
if
(
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
)
<
0
)
return
-
1
;
ret
=
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
);
if
(
ret
<
0
)
return
ret
;
// Scale factors
nsubbands
=
ff_dca_scf_to_grid_1
[
s
->
nsubbands
-
1
]
+
1
;
for
(
sb
=
2
;
sb
<
nsubbands
;
sb
++
)
{
if
(
parse_scale_factors
(
s
,
s
->
grid_1_scf
[
ch1
][
sb
])
<
0
)
return
-
1
;
if
(
ch1
!=
ch2
&&
ff_dca_grid_1_to_scf
[
sb
]
<
s
->
min_mono_subband
&&
parse_scale_factors
(
s
,
s
->
grid_1_scf
[
ch2
][
sb
])
<
0
)
return
-
1
;
ret
=
parse_scale_factors
(
s
,
s
->
grid_1_scf
[
ch1
][
sb
]);
if
(
ret
<
0
)
return
ret
;
if
(
ch1
!=
ch2
&&
ff_dca_grid_1_to_scf
[
sb
]
<
s
->
min_mono_subband
)
{
ret
=
parse_scale_factors
(
s
,
s
->
grid_1_scf
[
ch2
][
sb
]);
if
(
ret
<
0
)
return
ret
;
}
}
if
(
get_bits_left
(
&
s
->
gb
)
<
1
)
...
...
@@ -532,7 +546,7 @@ static int parse_grid_1_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch
if
(
get_bits_left
(
&
s
->
gb
)
<
0
)
{
av_log
(
s
->
avctx
,
AV_LOG_ERROR
,
"First grid chunk too short
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
// Stereo image for partial mono mode
...
...
@@ -562,14 +576,16 @@ static int parse_grid_1_chunk(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int ch
static
int
parse_grid_1_sec_ch
(
DCALbrDecoder
*
s
,
int
ch2
)
{
int
sb
,
nsubbands
;
int
sb
,
nsubbands
,
ret
;
// Scale factors
nsubbands
=
ff_dca_scf_to_grid_1
[
s
->
nsubbands
-
1
]
+
1
;
for
(
sb
=
2
;
sb
<
nsubbands
;
sb
++
)
{
if
(
ff_dca_grid_1_to_scf
[
sb
]
>=
s
->
min_mono_subband
&&
parse_scale_factors
(
s
,
s
->
grid_1_scf
[
ch2
][
sb
])
<
0
)
return
-
1
;
if
(
ff_dca_grid_1_to_scf
[
sb
]
>=
s
->
min_mono_subband
)
{
ret
=
parse_scale_factors
(
s
,
s
->
grid_1_scf
[
ch2
][
sb
]);
if
(
ret
<
0
)
return
ret
;
}
}
// Average values for third grid
...
...
@@ -709,7 +725,7 @@ static int parse_ts(DCALbrDecoder *s, int ch1, int ch2,
s
->
sb_indices
[
sb
]
=
sb_reorder
;
}
if
(
sb_reorder
>=
s
->
nsubbands
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
// Third grid scale factors
if
(
sb
==
12
)
{
...
...
@@ -731,7 +747,7 @@ static int parse_ts(DCALbrDecoder *s, int ch1, int ch2,
quant_level
=
s
->
quant_levels
[
ch1
/
2
][
sb
];
if
(
!
quant_level
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
// Time samples for one or both channels
if
(
sb
<
s
->
max_mono_subband
&&
sb_reorder
>=
s
->
min_mono_subband
)
{
...
...
@@ -792,13 +808,14 @@ static int parse_lpc(DCALbrDecoder *s, int ch1, int ch2, int start_sb, int end_s
static
int
parse_high_res_grid
(
DCALbrDecoder
*
s
,
LBRChunk
*
chunk
,
int
ch1
,
int
ch2
)
{
int
quant_levels
[
DCA_LBR_SUBBANDS
];
int
sb
,
ch
,
ol
,
st
,
max_sb
,
profile
;
int
sb
,
ch
,
ol
,
st
,
max_sb
,
profile
,
ret
;
if
(
!
chunk
->
len
)
return
0
;
if
(
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
)
<
0
)
return
-
1
;
ret
=
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
);
if
(
ret
<
0
)
return
ret
;
// Quantizer profile
profile
=
get_bits
(
&
s
->
gb
,
8
);
...
...
@@ -832,18 +849,20 @@ static int parse_high_res_grid(DCALbrDecoder *s, LBRChunk *chunk, int ch1, int c
s
->
quant_levels
[
ch1
/
2
][
sb
]
=
quant_levels
[
sb
];
// LPC for the first two subbands
if
(
parse_lpc
(
s
,
ch1
,
ch2
,
0
,
2
)
<
0
)
return
-
1
;
ret
=
parse_lpc
(
s
,
ch1
,
ch2
,
0
,
2
);
if
(
ret
<
0
)
return
ret
;
// Time-samples for the first two subbands of main channel
if
(
parse_ts
(
s
,
ch1
,
ch2
,
0
,
2
,
0
)
<
0
)
return
-
1
;
ret
=
parse_ts
(
s
,
ch1
,
ch2
,
0
,
2
,
0
);
if
(
ret
<
0
)
return
ret
;
// First two bands of the first grid
for
(
sb
=
0
;
sb
<
2
;
sb
++
)
for
(
ch
=
ch1
;
ch
<=
ch2
;
ch
++
)
if
(
parse_scale_factors
(
s
,
s
->
grid_1_scf
[
ch
][
sb
]
)
<
0
)
return
-
1
;
if
(
(
ret
=
parse_scale_factors
(
s
,
s
->
grid_1_scf
[
ch
][
sb
])
)
<
0
)
return
ret
;
return
0
;
}
...
...
@@ -892,39 +911,42 @@ static int parse_grid_2(DCALbrDecoder *s, int ch1, int ch2,
static
int
parse_ts1_chunk
(
DCALbrDecoder
*
s
,
LBRChunk
*
chunk
,
int
ch1
,
int
ch2
)
{
int
ret
;
if
(
!
chunk
->
len
)
return
0
;
if
(
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
)
<
0
)
return
-
1
;
if
(
parse_lpc
(
s
,
ch1
,
ch2
,
2
,
3
)
<
0
)
return
-
1
;
if
(
parse_ts
(
s
,
ch1
,
ch2
,
2
,
4
,
0
)
<
0
)
return
-
1
;
if
(
parse_grid_2
(
s
,
ch1
,
ch2
,
0
,
1
,
0
)
<
0
)
return
-
1
;
if
(
parse_ts
(
s
,
ch1
,
ch2
,
4
,
6
,
0
)
<
0
)
return
-
1
;
if
(
(
ret
=
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
)
)
<
0
)
return
ret
;
if
(
(
ret
=
parse_lpc
(
s
,
ch1
,
ch2
,
2
,
3
)
)
<
0
)
return
ret
;
if
(
(
ret
=
parse_ts
(
s
,
ch1
,
ch2
,
2
,
4
,
0
)
)
<
0
)
return
ret
;
if
(
(
ret
=
parse_grid_2
(
s
,
ch1
,
ch2
,
0
,
1
,
0
)
)
<
0
)
return
ret
;
if
(
(
ret
=
parse_ts
(
s
,
ch1
,
ch2
,
4
,
6
,
0
)
)
<
0
)
return
ret
;
return
0
;
}
static
int
parse_ts2_chunk
(
DCALbrDecoder
*
s
,
LBRChunk
*
chunk
,
int
ch1
,
int
ch2
)
{
int
ret
;
if
(
!
chunk
->
len
)
return
0
;
if
(
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
)
<
0
)
return
-
1
;
if
(
parse_grid_2
(
s
,
ch1
,
ch2
,
1
,
3
,
0
)
<
0
)
return
-
1
;
if
(
parse_ts
(
s
,
ch1
,
ch2
,
6
,
s
->
max_mono_subband
,
0
)
<
0
)
return
-
1
;
if
(
(
ret
=
init_get_bits8
(
&
s
->
gb
,
chunk
->
data
,
chunk
->
len
)
)
<
0
)
return
ret
;
if
(
(
ret
=
parse_grid_2
(
s
,
ch1
,
ch2
,
1
,
3
,
0
)
)
<
0
)
return
ret
;
if
(
(
ret
=
parse_ts
(
s
,
ch1
,
ch2
,
6
,
s
->
max_mono_subband
,
0
)
)
<
0
)
return
ret
;
if
(
ch1
!=
ch2
)
{
if
(
parse_grid_1_sec_ch
(
s
,
ch2
)
<
0
)
return
-
1
;
if
(
parse_grid_2
(
s
,
ch1
,
ch2
,
0
,
3
,
1
)
<
0
)
return
-
1
;
if
(
(
ret
=
parse_grid_1_sec_ch
(
s
,
ch2
)
)
<
0
)
return
ret
;
if
(
(
ret
=
parse_grid_2
(
s
,
ch1
,
ch2
,
0
,
3
,
1
)
)
<
0
)
return
ret
;
}
if
(
parse_ts
(
s
,
ch1
,
ch2
,
s
->
min_mono_subband
,
s
->
nsubbands
,
1
)
<
0
)
return
-
1
;
if
(
(
ret
=
parse_ts
(
s
,
ch1
,
ch2
,
s
->
min_mono_subband
,
s
->
nsubbands
,
1
)
)
<
0
)
return
ret
;
return
0
;
}
...
...
@@ -932,11 +954,13 @@ static int init_sample_rate(DCALbrDecoder *s)
{
double
scale
=
(
-
1
.
0
/
(
1
<<
17
))
*
sqrt
(
1
<<
(
2
-
s
->
limited_range
));
int
i
,
br_per_ch
=
s
->
bit_rate_scaled
/
s
->
nchannels_total
;
int
ret
;
ff_mdct_end
(
&
s
->
imdct
);
if
(
ff_mdct_init
(
&
s
->
imdct
,
s
->
freq_range
+
6
,
1
,
scale
)
<
0
)
return
-
1
;
ret
=
ff_mdct_init
(
&
s
->
imdct
,
s
->
freq_range
+
6
,
1
,
scale
);
if
(
ret
<
0
)
return
ret
;
for
(
i
=
0
;
i
<
32
<<
s
->
freq_range
;
i
++
)
s
->
window
[
i
]
=
ff_dca_long_window
[
i
<<
(
2
-
s
->
freq_range
)];
...
...
@@ -975,7 +999,7 @@ static int alloc_sample_buffer(DCALbrDecoder *s)
// Reallocate time sample buffer
av_fast_mallocz
(
&
s
->
ts_buffer
,
&
s
->
ts_size
,
nsamples
*
sizeof
(
float
));
if
(
!
s
->
ts_buffer
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
ptr
=
s
->
ts_buffer
+
DCA_LBR_TIME_HISTORY
;
for
(
ch
=
0
;
ch
<
s
->
nchannels
;
ch
++
)
{
...
...
@@ -1796,7 +1820,7 @@ av_cold int ff_dca_lbr_init(DCALbrDecoder *s)
init_tables
();
if
(
!
(
s
->
fdsp
=
avpriv_float_dsp_alloc
(
0
)))
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
s
->
lbr_rand
=
1
;
return
0
;
...
...
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