Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
82be06bb
Commit
82be06bb
authored
Oct 13, 2011
by
Justin Ruggles
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mlpdec: return meaningful error codes instead of -1
parent
e1b8d88d
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
61 additions
and
57 deletions
+61
-57
mlp_parser.c
libavcodec/mlp_parser.c
+3
-3
mlpdec.c
libavcodec/mlpdec.c
+58
-54
No files found.
libavcodec/mlp_parser.c
View file @
82be06bb
...
@@ -138,11 +138,11 @@ int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, GetBitContext *gb)
...
@@ -138,11 +138,11 @@ int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, GetBitContext *gb)
checksum
=
ff_mlp_checksum16
(
gb
->
buffer
,
26
);
checksum
=
ff_mlp_checksum16
(
gb
->
buffer
,
26
);
if
(
checksum
!=
AV_RL16
(
gb
->
buffer
+
26
))
{
if
(
checksum
!=
AV_RL16
(
gb
->
buffer
+
26
))
{
av_log
(
log
,
AV_LOG_ERROR
,
"major sync info header checksum error
\n
"
);
av_log
(
log
,
AV_LOG_ERROR
,
"major sync info header checksum error
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
get_bits_long
(
gb
,
24
)
!=
0xf8726f
)
/* Sync words */
if
(
get_bits_long
(
gb
,
24
)
!=
0xf8726f
)
/* Sync words */
return
-
1
;
return
AVERROR_INVALIDDATA
;
mh
->
stream_type
=
get_bits
(
gb
,
8
);
mh
->
stream_type
=
get_bits
(
gb
,
8
);
...
@@ -173,7 +173,7 @@ int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, GetBitContext *gb)
...
@@ -173,7 +173,7 @@ int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, GetBitContext *gb)
mh
->
channels_thd_stream2
=
get_bits
(
gb
,
13
);
mh
->
channels_thd_stream2
=
get_bits
(
gb
,
13
);
}
else
}
else
return
-
1
;
return
AVERROR_INVALIDDATA
;
mh
->
access_unit_size
=
40
<<
(
ratebits
&
7
);
mh
->
access_unit_size
=
40
<<
(
ratebits
&
7
);
mh
->
access_unit_size_pow2
=
64
<<
(
ratebits
&
7
);
mh
->
access_unit_size_pow2
=
64
<<
(
ratebits
&
7
);
...
...
libavcodec/mlpdec.c
View file @
82be06bb
...
@@ -214,7 +214,7 @@ static inline int read_huff_channels(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -214,7 +214,7 @@ static inline int read_huff_channels(MLPDecodeContext *m, GetBitContext *gbp,
VLC_BITS
,
(
9
+
VLC_BITS
-
1
)
/
VLC_BITS
);
VLC_BITS
,
(
9
+
VLC_BITS
-
1
)
/
VLC_BITS
);
if
(
result
<
0
)
if
(
result
<
0
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
lsb_bits
>
0
)
if
(
lsb_bits
>
0
)
result
=
(
result
<<
lsb_bits
)
+
get_bits
(
gbp
,
lsb_bits
);
result
=
(
result
<<
lsb_bits
)
+
get_bits
(
gbp
,
lsb_bits
);
...
@@ -250,61 +250,61 @@ static av_cold int mlp_decode_init(AVCodecContext *avctx)
...
@@ -250,61 +250,61 @@ static av_cold int mlp_decode_init(AVCodecContext *avctx)
static
int
read_major_sync
(
MLPDecodeContext
*
m
,
GetBitContext
*
gb
)
static
int
read_major_sync
(
MLPDecodeContext
*
m
,
GetBitContext
*
gb
)
{
{
MLPHeaderInfo
mh
;
MLPHeaderInfo
mh
;
int
substr
;
int
substr
,
ret
;
if
(
ff_mlp_read_major_sync
(
m
->
avctx
,
&
mh
,
gb
)
!=
0
)
if
(
(
ret
=
ff_mlp_read_major_sync
(
m
->
avctx
,
&
mh
,
gb
)
)
!=
0
)
return
-
1
;
return
ret
;
if
(
mh
.
group1_bits
==
0
)
{
if
(
mh
.
group1_bits
==
0
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"invalid/unknown bits per sample
\n
"
);
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"invalid/unknown bits per sample
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
mh
.
group2_bits
>
mh
.
group1_bits
)
{
if
(
mh
.
group2_bits
>
mh
.
group1_bits
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Channel group 2 cannot have more bits per sample than group 1.
\n
"
);
"Channel group 2 cannot have more bits per sample than group 1.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
mh
.
group2_samplerate
&&
mh
.
group2_samplerate
!=
mh
.
group1_samplerate
)
{
if
(
mh
.
group2_samplerate
&&
mh
.
group2_samplerate
!=
mh
.
group1_samplerate
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Channel groups with differing sample rates are not currently supported.
\n
"
);
"Channel groups with differing sample rates are not currently supported.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
mh
.
group1_samplerate
==
0
)
{
if
(
mh
.
group1_samplerate
==
0
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"invalid/unknown sampling rate
\n
"
);
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"invalid/unknown sampling rate
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
mh
.
group1_samplerate
>
MAX_SAMPLERATE
)
{
if
(
mh
.
group1_samplerate
>
MAX_SAMPLERATE
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Sampling rate %d is greater than the supported maximum (%d).
\n
"
,
"Sampling rate %d is greater than the supported maximum (%d).
\n
"
,
mh
.
group1_samplerate
,
MAX_SAMPLERATE
);
mh
.
group1_samplerate
,
MAX_SAMPLERATE
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
mh
.
access_unit_size
>
MAX_BLOCKSIZE
)
{
if
(
mh
.
access_unit_size
>
MAX_BLOCKSIZE
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Block size %d is greater than the supported maximum (%d).
\n
"
,
"Block size %d is greater than the supported maximum (%d).
\n
"
,
mh
.
access_unit_size
,
MAX_BLOCKSIZE
);
mh
.
access_unit_size
,
MAX_BLOCKSIZE
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
mh
.
access_unit_size_pow2
>
MAX_BLOCKSIZE_POW2
)
{
if
(
mh
.
access_unit_size_pow2
>
MAX_BLOCKSIZE_POW2
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Block size pow2 %d is greater than the supported maximum (%d).
\n
"
,
"Block size pow2 %d is greater than the supported maximum (%d).
\n
"
,
mh
.
access_unit_size_pow2
,
MAX_BLOCKSIZE_POW2
);
mh
.
access_unit_size_pow2
,
MAX_BLOCKSIZE_POW2
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
mh
.
num_substreams
==
0
)
if
(
mh
.
num_substreams
==
0
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
m
->
avctx
->
codec_id
==
CODEC_ID_MLP
&&
mh
.
num_substreams
>
2
)
{
if
(
m
->
avctx
->
codec_id
==
CODEC_ID_MLP
&&
mh
.
num_substreams
>
2
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"MLP only supports up to 2 substreams.
\n
"
);
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"MLP only supports up to 2 substreams.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
mh
.
num_substreams
>
MAX_SUBSTREAMS
)
{
if
(
mh
.
num_substreams
>
MAX_SUBSTREAMS
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Number of substreams %d is larger than the maximum supported "
"Number of substreams %d is larger than the maximum supported "
"by the decoder. %s
\n
"
,
mh
.
num_substreams
,
sample_message
);
"by the decoder. %s
\n
"
,
mh
.
num_substreams
,
sample_message
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
m
->
access_unit_size
=
mh
.
access_unit_size
;
m
->
access_unit_size
=
mh
.
access_unit_size
;
...
@@ -351,14 +351,14 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -351,14 +351,14 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
if
(
sync_word
!=
0x31ea
>>
1
)
{
if
(
sync_word
!=
0x31ea
>>
1
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"restart header sync incorrect (got 0x%04x)
\n
"
,
sync_word
);
"restart header sync incorrect (got 0x%04x)
\n
"
,
sync_word
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
s
->
noise_type
=
get_bits1
(
gbp
);
s
->
noise_type
=
get_bits1
(
gbp
);
if
(
m
->
avctx
->
codec_id
==
CODEC_ID_MLP
&&
s
->
noise_type
)
{
if
(
m
->
avctx
->
codec_id
==
CODEC_ID_MLP
&&
s
->
noise_type
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"MLP must have 0x31ea sync word.
\n
"
);
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"MLP must have 0x31ea sync word.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
skip_bits
(
gbp
,
16
);
/* Output timestamp */
skip_bits
(
gbp
,
16
);
/* Output timestamp */
...
@@ -371,13 +371,13 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -371,13 +371,13 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Max matrix channel cannot be greater than %d.
\n
"
,
"Max matrix channel cannot be greater than %d.
\n
"
,
max_matrix_channel
);
max_matrix_channel
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
s
->
max_channel
!=
s
->
max_matrix_channel
)
{
if
(
s
->
max_channel
!=
s
->
max_matrix_channel
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Max channel must be equal max matrix channel.
\n
"
);
"Max channel must be equal max matrix channel.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
/* This should happen for TrueHD streams with >6 channels and MLP's noise
/* This should happen for TrueHD streams with >6 channels and MLP's noise
...
@@ -386,13 +386,13 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -386,13 +386,13 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Number of channels %d is larger than the maximum supported "
"Number of channels %d is larger than the maximum supported "
"by the decoder. %s
\n
"
,
s
->
max_channel
+
2
,
sample_message
);
"by the decoder. %s
\n
"
,
s
->
max_channel
+
2
,
sample_message
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
s
->
min_channel
>
s
->
max_channel
)
{
if
(
s
->
min_channel
>
s
->
max_channel
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Substream min channel cannot be greater than max channel.
\n
"
);
"Substream min channel cannot be greater than max channel.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
m
->
avctx
->
request_channels
>
0
if
(
m
->
avctx
->
request_channels
>
0
...
@@ -431,7 +431,7 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -431,7 +431,7 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Assignment of matrix channel %d to invalid output channel %d. %s
\n
"
,
"Assignment of matrix channel %d to invalid output channel %d. %s
\n
"
,
ch
,
ch_assign
,
sample_message
);
ch
,
ch_assign
,
sample_message
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
s
->
ch_assign
[
ch_assign
]
=
ch
;
s
->
ch_assign
[
ch_assign
]
=
ch
;
}
}
...
@@ -487,7 +487,7 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -487,7 +487,7 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
if
(
m
->
filter_changed
[
channel
][
filter
]
++
>
1
)
{
if
(
m
->
filter_changed
[
channel
][
filter
]
++
>
1
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Filters may change only once per access unit.
\n
"
);
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Filters may change only once per access unit.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
order
=
get_bits
(
gbp
,
4
);
order
=
get_bits
(
gbp
,
4
);
...
@@ -495,7 +495,7 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -495,7 +495,7 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"%cIR filter order %d is greater than maximum %d.
\n
"
,
"%cIR filter order %d is greater than maximum %d.
\n
"
,
fchar
,
order
,
max_order
);
fchar
,
order
,
max_order
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
fp
->
order
=
order
;
fp
->
order
=
order
;
...
@@ -511,13 +511,13 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -511,13 +511,13 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"%cIR filter coeff_bits must be between 1 and 16.
\n
"
,
"%cIR filter coeff_bits must be between 1 and 16.
\n
"
,
fchar
);
fchar
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
coeff_bits
+
coeff_shift
>
16
)
{
if
(
coeff_bits
+
coeff_shift
>
16
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Sum of coeff_bits and coeff_shift for %cIR filter must be 16 or less.
\n
"
,
"Sum of coeff_bits and coeff_shift for %cIR filter must be 16 or less.
\n
"
,
fchar
);
fchar
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
for
(
i
=
0
;
i
<
order
;
i
++
)
for
(
i
=
0
;
i
<
order
;
i
++
)
...
@@ -529,7 +529,7 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -529,7 +529,7 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
if
(
filter
==
FIR
)
{
if
(
filter
==
FIR
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"FIR filter has state data specified.
\n
"
);
"FIR filter has state data specified.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
state_bits
=
get_bits
(
gbp
,
4
);
state_bits
=
get_bits
(
gbp
,
4
);
...
@@ -557,7 +557,7 @@ static int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitCo
...
@@ -557,7 +557,7 @@ static int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitCo
if
(
m
->
matrix_changed
++
>
1
)
{
if
(
m
->
matrix_changed
++
>
1
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Matrices may change only once per access unit.
\n
"
);
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Matrices may change only once per access unit.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
s
->
num_primitive_matrices
=
get_bits
(
gbp
,
4
);
s
->
num_primitive_matrices
=
get_bits
(
gbp
,
4
);
...
@@ -566,7 +566,7 @@ static int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitCo
...
@@ -566,7 +566,7 @@ static int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitCo
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Number of primitive matrices cannot be greater than %d.
\n
"
,
"Number of primitive matrices cannot be greater than %d.
\n
"
,
max_primitive_matrices
);
max_primitive_matrices
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
for
(
mat
=
0
;
mat
<
s
->
num_primitive_matrices
;
mat
++
)
{
for
(
mat
=
0
;
mat
<
s
->
num_primitive_matrices
;
mat
++
)
{
...
@@ -579,12 +579,12 @@ static int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitCo
...
@@ -579,12 +579,12 @@ static int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitCo
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Invalid channel %d specified as output from matrix.
\n
"
,
"Invalid channel %d specified as output from matrix.
\n
"
,
s
->
matrix_out_ch
[
mat
]);
s
->
matrix_out_ch
[
mat
]);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
frac_bits
>
14
)
{
if
(
frac_bits
>
14
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Too many fractional bits specified.
\n
"
);
"Too many fractional bits specified.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
max_chan
=
s
->
max_matrix_channel
;
max_chan
=
s
->
max_matrix_channel
;
...
@@ -617,27 +617,28 @@ static int read_channel_params(MLPDecodeContext *m, unsigned int substr,
...
@@ -617,27 +617,28 @@ static int read_channel_params(MLPDecodeContext *m, unsigned int substr,
ChannelParams
*
cp
=
&
s
->
channel_params
[
ch
];
ChannelParams
*
cp
=
&
s
->
channel_params
[
ch
];
FilterParams
*
fir
=
&
cp
->
filter_params
[
FIR
];
FilterParams
*
fir
=
&
cp
->
filter_params
[
FIR
];
FilterParams
*
iir
=
&
cp
->
filter_params
[
IIR
];
FilterParams
*
iir
=
&
cp
->
filter_params
[
IIR
];
int
ret
;
if
(
s
->
param_presence_flags
&
PARAM_FIR
)
if
(
s
->
param_presence_flags
&
PARAM_FIR
)
if
(
get_bits1
(
gbp
))
if
(
get_bits1
(
gbp
))
if
(
read_filter_params
(
m
,
gbp
,
substr
,
ch
,
FIR
)
<
0
)
if
(
(
ret
=
read_filter_params
(
m
,
gbp
,
substr
,
ch
,
FIR
)
)
<
0
)
return
-
1
;
return
ret
;
if
(
s
->
param_presence_flags
&
PARAM_IIR
)
if
(
s
->
param_presence_flags
&
PARAM_IIR
)
if
(
get_bits1
(
gbp
))
if
(
get_bits1
(
gbp
))
if
(
read_filter_params
(
m
,
gbp
,
substr
,
ch
,
IIR
)
<
0
)
if
(
(
ret
=
read_filter_params
(
m
,
gbp
,
substr
,
ch
,
IIR
)
)
<
0
)
return
-
1
;
return
ret
;
if
(
fir
->
order
+
iir
->
order
>
8
)
{
if
(
fir
->
order
+
iir
->
order
>
8
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Total filter orders too high.
\n
"
);
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Total filter orders too high.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
fir
->
order
&&
iir
->
order
&&
if
(
fir
->
order
&&
iir
->
order
&&
fir
->
shift
!=
iir
->
shift
)
{
fir
->
shift
!=
iir
->
shift
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"FIR and IIR filters must use the same precision.
\n
"
);
"FIR and IIR filters must use the same precision.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
/* The FIR and IIR filters must have the same precision.
/* The FIR and IIR filters must have the same precision.
* To simplify the filtering code, only the precision of the
* To simplify the filtering code, only the precision of the
...
@@ -656,7 +657,7 @@ static int read_channel_params(MLPDecodeContext *m, unsigned int substr,
...
@@ -656,7 +657,7 @@ static int read_channel_params(MLPDecodeContext *m, unsigned int substr,
if
(
cp
->
huff_lsbs
>
24
)
{
if
(
cp
->
huff_lsbs
>
24
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Invalid huff_lsbs.
\n
"
);
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Invalid huff_lsbs.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
cp
->
sign_huff_offset
=
calculate_sign_huff
(
m
,
substr
,
ch
);
cp
->
sign_huff_offset
=
calculate_sign_huff
(
m
,
substr
,
ch
);
...
@@ -672,6 +673,7 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -672,6 +673,7 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
{
{
SubStream
*
s
=
&
m
->
substream
[
substr
];
SubStream
*
s
=
&
m
->
substream
[
substr
];
unsigned
int
ch
;
unsigned
int
ch
;
int
ret
;
if
(
s
->
param_presence_flags
&
PARAM_PRESENCE
)
if
(
s
->
param_presence_flags
&
PARAM_PRESENCE
)
if
(
get_bits1
(
gbp
))
if
(
get_bits1
(
gbp
))
...
@@ -683,14 +685,14 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -683,14 +685,14 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
if
(
s
->
blocksize
<
8
||
s
->
blocksize
>
m
->
access_unit_size
)
{
if
(
s
->
blocksize
<
8
||
s
->
blocksize
>
m
->
access_unit_size
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Invalid blocksize."
);
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Invalid blocksize."
);
s
->
blocksize
=
0
;
s
->
blocksize
=
0
;
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
}
}
if
(
s
->
param_presence_flags
&
PARAM_MATRIX
)
if
(
s
->
param_presence_flags
&
PARAM_MATRIX
)
if
(
get_bits1
(
gbp
))
if
(
get_bits1
(
gbp
))
if
(
read_matrix_params
(
m
,
substr
,
gbp
)
<
0
)
if
(
(
ret
=
read_matrix_params
(
m
,
substr
,
gbp
)
)
<
0
)
return
-
1
;
return
ret
;
if
(
s
->
param_presence_flags
&
PARAM_OUTSHIFT
)
if
(
s
->
param_presence_flags
&
PARAM_OUTSHIFT
)
if
(
get_bits1
(
gbp
))
if
(
get_bits1
(
gbp
))
...
@@ -709,8 +711,8 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -709,8 +711,8 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
for
(
ch
=
s
->
min_channel
;
ch
<=
s
->
max_channel
;
ch
++
)
for
(
ch
=
s
->
min_channel
;
ch
<=
s
->
max_channel
;
ch
++
)
if
(
get_bits1
(
gbp
))
if
(
get_bits1
(
gbp
))
if
(
read_channel_params
(
m
,
substr
,
gbp
,
ch
)
<
0
)
if
(
(
ret
=
read_channel_params
(
m
,
substr
,
gbp
,
ch
)
)
<
0
)
return
-
1
;
return
ret
;
return
0
;
return
0
;
}
}
...
@@ -752,6 +754,7 @@ static int read_block_data(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -752,6 +754,7 @@ static int read_block_data(MLPDecodeContext *m, GetBitContext *gbp,
{
{
SubStream
*
s
=
&
m
->
substream
[
substr
];
SubStream
*
s
=
&
m
->
substream
[
substr
];
unsigned
int
i
,
ch
,
expected_stream_pos
=
0
;
unsigned
int
i
,
ch
,
expected_stream_pos
=
0
;
int
ret
;
if
(
s
->
data_check_present
)
{
if
(
s
->
data_check_present
)
{
expected_stream_pos
=
get_bits_count
(
gbp
);
expected_stream_pos
=
get_bits_count
(
gbp
);
...
@@ -762,15 +765,15 @@ static int read_block_data(MLPDecodeContext *m, GetBitContext *gbp,
...
@@ -762,15 +765,15 @@ static int read_block_data(MLPDecodeContext *m, GetBitContext *gbp,
if
(
s
->
blockpos
+
s
->
blocksize
>
m
->
access_unit_size
)
{
if
(
s
->
blockpos
+
s
->
blocksize
>
m
->
access_unit_size
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"too many audio samples in frame
\n
"
);
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"too many audio samples in frame
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
memset
(
&
m
->
bypassed_lsbs
[
s
->
blockpos
][
0
],
0
,
memset
(
&
m
->
bypassed_lsbs
[
s
->
blockpos
][
0
],
0
,
s
->
blocksize
*
sizeof
(
m
->
bypassed_lsbs
[
0
]));
s
->
blocksize
*
sizeof
(
m
->
bypassed_lsbs
[
0
]));
for
(
i
=
0
;
i
<
s
->
blocksize
;
i
++
)
for
(
i
=
0
;
i
<
s
->
blocksize
;
i
++
)
if
(
read_huff_channels
(
m
,
gbp
,
substr
,
i
)
<
0
)
if
(
(
ret
=
read_huff_channels
(
m
,
gbp
,
substr
,
i
)
)
<
0
)
return
-
1
;
return
ret
;
for
(
ch
=
s
->
min_channel
;
ch
<=
s
->
max_channel
;
ch
++
)
for
(
ch
=
s
->
min_channel
;
ch
<=
s
->
max_channel
;
ch
++
)
filter_channel
(
m
,
substr
,
ch
);
filter_channel
(
m
,
substr
,
ch
);
...
@@ -956,6 +959,7 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
...
@@ -956,6 +959,7 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
uint8_t
substream_parity_present
[
MAX_SUBSTREAMS
];
uint8_t
substream_parity_present
[
MAX_SUBSTREAMS
];
uint16_t
substream_data_len
[
MAX_SUBSTREAMS
];
uint16_t
substream_data_len
[
MAX_SUBSTREAMS
];
uint8_t
parity_bits
;
uint8_t
parity_bits
;
int
ret
;
if
(
buf_size
<
4
)
if
(
buf_size
<
4
)
return
0
;
return
0
;
...
@@ -963,7 +967,7 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
...
@@ -963,7 +967,7 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
length
=
(
AV_RB16
(
buf
)
&
0xfff
)
*
2
;
length
=
(
AV_RB16
(
buf
)
&
0xfff
)
*
2
;
if
(
length
<
4
||
length
>
buf_size
)
if
(
length
<
4
||
length
>
buf_size
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
init_get_bits
(
&
gb
,
(
buf
+
4
),
(
length
-
4
)
*
8
);
init_get_bits
(
&
gb
,
(
buf
+
4
),
(
length
-
4
)
*
8
);
...
@@ -1069,8 +1073,8 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
...
@@ -1069,8 +1073,8 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
if
(
!
s
->
restart_seen
)
if
(
!
s
->
restart_seen
)
goto
next_substr
;
goto
next_substr
;
if
(
read_block_data
(
m
,
&
gb
,
substr
)
<
0
)
if
(
(
ret
=
read_block_data
(
m
,
&
gb
,
substr
)
)
<
0
)
return
-
1
;
return
ret
;
if
(
get_bits_count
(
&
gb
)
>=
substream_data_len
[
substr
]
*
8
)
if
(
get_bits_count
(
&
gb
)
>=
substream_data_len
[
substr
]
*
8
)
goto
substream_length_mismatch
;
goto
substream_length_mismatch
;
...
@@ -1083,13 +1087,13 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
...
@@ -1083,13 +1087,13 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
int
shorten_by
;
int
shorten_by
;
if
(
get_bits
(
&
gb
,
16
)
!=
0xD234
)
if
(
get_bits
(
&
gb
,
16
)
!=
0xD234
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
shorten_by
=
get_bits
(
&
gb
,
16
);
shorten_by
=
get_bits
(
&
gb
,
16
);
if
(
m
->
avctx
->
codec_id
==
CODEC_ID_TRUEHD
&&
shorten_by
&
0x2000
)
if
(
m
->
avctx
->
codec_id
==
CODEC_ID_TRUEHD
&&
shorten_by
&
0x2000
)
s
->
blockpos
-=
FFMIN
(
shorten_by
&
0x1FFF
,
s
->
blockpos
);
s
->
blockpos
-=
FFMIN
(
shorten_by
&
0x1FFF
,
s
->
blockpos
);
else
if
(
m
->
avctx
->
codec_id
==
CODEC_ID_MLP
&&
shorten_by
!=
0xD234
)
else
if
(
m
->
avctx
->
codec_id
==
CODEC_ID_MLP
&&
shorten_by
!=
0xD234
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
substr
==
m
->
max_decoded_substream
)
if
(
substr
==
m
->
max_decoded_substream
)
av_log
(
m
->
avctx
,
AV_LOG_INFO
,
"End of stream indicated.
\n
"
);
av_log
(
m
->
avctx
,
AV_LOG_INFO
,
"End of stream indicated.
\n
"
);
...
@@ -1123,18 +1127,18 @@ next_substr:
...
@@ -1123,18 +1127,18 @@ next_substr:
rematrix_channels
(
m
,
m
->
max_decoded_substream
);
rematrix_channels
(
m
,
m
->
max_decoded_substream
);
if
(
output_data
(
m
,
m
->
max_decoded_substream
,
data
,
data_size
)
<
0
)
if
(
(
ret
=
output_data
(
m
,
m
->
max_decoded_substream
,
data
,
data_size
)
)
<
0
)
return
-
1
;
return
ret
;
return
length
;
return
length
;
substream_length_mismatch:
substream_length_mismatch:
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"substream %d length mismatch
\n
"
,
substr
);
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"substream %d length mismatch
\n
"
,
substr
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
error:
error:
m
->
params_valid
=
0
;
m
->
params_valid
=
0
;
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
AVCodec
ff_mlp_decoder
=
{
AVCodec
ff_mlp_decoder
=
{
...
...
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