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
Show 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)
checksum
=
ff_mlp_checksum16
(
gb
->
buffer
,
26
);
if
(
checksum
!=
AV_RL16
(
gb
->
buffer
+
26
))
{
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 */
return
-
1
;
return
AVERROR_INVALIDDATA
;
mh
->
stream_type
=
get_bits
(
gb
,
8
);
...
...
@@ -173,7 +173,7 @@ int ff_mlp_read_major_sync(void *log, MLPHeaderInfo *mh, GetBitContext *gb)
mh
->
channels_thd_stream2
=
get_bits
(
gb
,
13
);
}
else
return
-
1
;
return
AVERROR_INVALIDDATA
;
mh
->
access_unit_size
=
40
<<
(
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,
VLC_BITS
,
(
9
+
VLC_BITS
-
1
)
/
VLC_BITS
);
if
(
result
<
0
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
lsb_bits
>
0
)
result
=
(
result
<<
lsb_bits
)
+
get_bits
(
gbp
,
lsb_bits
);
...
...
@@ -250,61 +250,61 @@ static av_cold int mlp_decode_init(AVCodecContext *avctx)
static
int
read_major_sync
(
MLPDecodeContext
*
m
,
GetBitContext
*
gb
)
{
MLPHeaderInfo
mh
;
int
substr
;
int
substr
,
ret
;
if
(
ff_mlp_read_major_sync
(
m
->
avctx
,
&
mh
,
gb
)
!=
0
)
return
-
1
;
if
(
(
ret
=
ff_mlp_read_major_sync
(
m
->
avctx
,
&
mh
,
gb
)
)
!=
0
)
return
ret
;
if
(
mh
.
group1_bits
==
0
)
{
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
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"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
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Channel groups with differing sample rates are not currently supported.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
mh
.
group1_samplerate
==
0
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"invalid/unknown sampling rate
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
mh
.
group1_samplerate
>
MAX_SAMPLERATE
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Sampling rate %d is greater than the supported maximum (%d).
\n
"
,
mh
.
group1_samplerate
,
MAX_SAMPLERATE
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
mh
.
access_unit_size
>
MAX_BLOCKSIZE
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Block size %d is greater than the supported maximum (%d).
\n
"
,
mh
.
access_unit_size
,
MAX_BLOCKSIZE
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
mh
.
access_unit_size_pow2
>
MAX_BLOCKSIZE_POW2
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Block size pow2 %d is greater than the supported maximum (%d).
\n
"
,
mh
.
access_unit_size_pow2
,
MAX_BLOCKSIZE_POW2
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
mh
.
num_substreams
==
0
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
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
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
mh
.
num_substreams
>
MAX_SUBSTREAMS
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Number of substreams %d is larger than the maximum supported "
"by the decoder. %s
\n
"
,
mh
.
num_substreams
,
sample_message
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
m
->
access_unit_size
=
mh
.
access_unit_size
;
...
...
@@ -351,14 +351,14 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
if
(
sync_word
!=
0x31ea
>>
1
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"restart header sync incorrect (got 0x%04x)
\n
"
,
sync_word
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
s
->
noise_type
=
get_bits1
(
gbp
);
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
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
skip_bits
(
gbp
,
16
);
/* Output timestamp */
...
...
@@ -371,13 +371,13 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Max matrix channel cannot be greater than %d.
\n
"
,
max_matrix_channel
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
s
->
max_channel
!=
s
->
max_matrix_channel
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"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
...
...
@@ -386,13 +386,13 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Number of channels %d is larger than the maximum supported "
"by the decoder. %s
\n
"
,
s
->
max_channel
+
2
,
sample_message
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
s
->
min_channel
>
s
->
max_channel
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Substream min channel cannot be greater than max channel.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
m
->
avctx
->
request_channels
>
0
...
...
@@ -431,7 +431,7 @@ static int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Assignment of matrix channel %d to invalid output channel %d. %s
\n
"
,
ch
,
ch_assign
,
sample_message
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
s
->
ch_assign
[
ch_assign
]
=
ch
;
}
...
...
@@ -487,7 +487,7 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
if
(
m
->
filter_changed
[
channel
][
filter
]
++
>
1
)
{
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
);
...
...
@@ -495,7 +495,7 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"%cIR filter order %d is greater than maximum %d.
\n
"
,
fchar
,
order
,
max_order
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
fp
->
order
=
order
;
...
...
@@ -511,13 +511,13 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"%cIR filter coeff_bits must be between 1 and 16.
\n
"
,
fchar
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
coeff_bits
+
coeff_shift
>
16
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Sum of coeff_bits and coeff_shift for %cIR filter must be 16 or less.
\n
"
,
fchar
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
for
(
i
=
0
;
i
<
order
;
i
++
)
...
...
@@ -529,7 +529,7 @@ static int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
if
(
filter
==
FIR
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"FIR filter has state data specified.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
state_bits
=
get_bits
(
gbp
,
4
);
...
...
@@ -557,7 +557,7 @@ static int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitCo
if
(
m
->
matrix_changed
++
>
1
)
{
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
);
...
...
@@ -566,7 +566,7 @@ static int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitCo
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Number of primitive matrices cannot be greater than %d.
\n
"
,
max_primitive_matrices
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
for
(
mat
=
0
;
mat
<
s
->
num_primitive_matrices
;
mat
++
)
{
...
...
@@ -579,12 +579,12 @@ static int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitCo
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Invalid channel %d specified as output from matrix.
\n
"
,
s
->
matrix_out_ch
[
mat
]);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
frac_bits
>
14
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Too many fractional bits specified.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
max_chan
=
s
->
max_matrix_channel
;
...
...
@@ -617,27 +617,28 @@ static int read_channel_params(MLPDecodeContext *m, unsigned int substr,
ChannelParams
*
cp
=
&
s
->
channel_params
[
ch
];
FilterParams
*
fir
=
&
cp
->
filter_params
[
FIR
];
FilterParams
*
iir
=
&
cp
->
filter_params
[
IIR
];
int
ret
;
if
(
s
->
param_presence_flags
&
PARAM_FIR
)
if
(
get_bits1
(
gbp
))
if
(
read_filter_params
(
m
,
gbp
,
substr
,
ch
,
FIR
)
<
0
)
return
-
1
;
if
(
(
ret
=
read_filter_params
(
m
,
gbp
,
substr
,
ch
,
FIR
)
)
<
0
)
return
ret
;
if
(
s
->
param_presence_flags
&
PARAM_IIR
)
if
(
get_bits1
(
gbp
))
if
(
read_filter_params
(
m
,
gbp
,
substr
,
ch
,
IIR
)
<
0
)
return
-
1
;
if
(
(
ret
=
read_filter_params
(
m
,
gbp
,
substr
,
ch
,
IIR
)
)
<
0
)
return
ret
;
if
(
fir
->
order
+
iir
->
order
>
8
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Total filter orders too high.
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
fir
->
order
&&
iir
->
order
&&
fir
->
shift
!=
iir
->
shift
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"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.
* To simplify the filtering code, only the precision of the
...
...
@@ -656,7 +657,7 @@ static int read_channel_params(MLPDecodeContext *m, unsigned int substr,
if
(
cp
->
huff_lsbs
>
24
)
{
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
);
...
...
@@ -672,6 +673,7 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
{
SubStream
*
s
=
&
m
->
substream
[
substr
];
unsigned
int
ch
;
int
ret
;
if
(
s
->
param_presence_flags
&
PARAM_PRESENCE
)
if
(
get_bits1
(
gbp
))
...
...
@@ -683,14 +685,14 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
if
(
s
->
blocksize
<
8
||
s
->
blocksize
>
m
->
access_unit_size
)
{
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"Invalid blocksize."
);
s
->
blocksize
=
0
;
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
s
->
param_presence_flags
&
PARAM_MATRIX
)
if
(
get_bits1
(
gbp
))
if
(
read_matrix_params
(
m
,
substr
,
gbp
)
<
0
)
return
-
1
;
if
(
(
ret
=
read_matrix_params
(
m
,
substr
,
gbp
)
)
<
0
)
return
ret
;
if
(
s
->
param_presence_flags
&
PARAM_OUTSHIFT
)
if
(
get_bits1
(
gbp
))
...
...
@@ -709,8 +711,8 @@ static int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
for
(
ch
=
s
->
min_channel
;
ch
<=
s
->
max_channel
;
ch
++
)
if
(
get_bits1
(
gbp
))
if
(
read_channel_params
(
m
,
substr
,
gbp
,
ch
)
<
0
)
return
-
1
;
if
(
(
ret
=
read_channel_params
(
m
,
substr
,
gbp
,
ch
)
)
<
0
)
return
ret
;
return
0
;
}
...
...
@@ -752,6 +754,7 @@ static int read_block_data(MLPDecodeContext *m, GetBitContext *gbp,
{
SubStream
*
s
=
&
m
->
substream
[
substr
];
unsigned
int
i
,
ch
,
expected_stream_pos
=
0
;
int
ret
;
if
(
s
->
data_check_present
)
{
expected_stream_pos
=
get_bits_count
(
gbp
);
...
...
@@ -762,15 +765,15 @@ static int read_block_data(MLPDecodeContext *m, GetBitContext *gbp,
if
(
s
->
blockpos
+
s
->
blocksize
>
m
->
access_unit_size
)
{
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
,
s
->
blocksize
*
sizeof
(
m
->
bypassed_lsbs
[
0
]));
for
(
i
=
0
;
i
<
s
->
blocksize
;
i
++
)
if
(
read_huff_channels
(
m
,
gbp
,
substr
,
i
)
<
0
)
return
-
1
;
if
(
(
ret
=
read_huff_channels
(
m
,
gbp
,
substr
,
i
)
)
<
0
)
return
ret
;
for
(
ch
=
s
->
min_channel
;
ch
<=
s
->
max_channel
;
ch
++
)
filter_channel
(
m
,
substr
,
ch
);
...
...
@@ -956,6 +959,7 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
uint8_t
substream_parity_present
[
MAX_SUBSTREAMS
];
uint16_t
substream_data_len
[
MAX_SUBSTREAMS
];
uint8_t
parity_bits
;
int
ret
;
if
(
buf_size
<
4
)
return
0
;
...
...
@@ -963,7 +967,7 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
length
=
(
AV_RB16
(
buf
)
&
0xfff
)
*
2
;
if
(
length
<
4
||
length
>
buf_size
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
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,
if
(
!
s
->
restart_seen
)
goto
next_substr
;
if
(
read_block_data
(
m
,
&
gb
,
substr
)
<
0
)
return
-
1
;
if
(
(
ret
=
read_block_data
(
m
,
&
gb
,
substr
)
)
<
0
)
return
ret
;
if
(
get_bits_count
(
&
gb
)
>=
substream_data_len
[
substr
]
*
8
)
goto
substream_length_mismatch
;
...
...
@@ -1083,13 +1087,13 @@ static int read_access_unit(AVCodecContext *avctx, void* data, int *data_size,
int
shorten_by
;
if
(
get_bits
(
&
gb
,
16
)
!=
0xD234
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
shorten_by
=
get_bits
(
&
gb
,
16
);
if
(
m
->
avctx
->
codec_id
==
CODEC_ID_TRUEHD
&&
shorten_by
&
0x2000
)
s
->
blockpos
-=
FFMIN
(
shorten_by
&
0x1FFF
,
s
->
blockpos
);
else
if
(
m
->
avctx
->
codec_id
==
CODEC_ID_MLP
&&
shorten_by
!=
0xD234
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
substr
==
m
->
max_decoded_substream
)
av_log
(
m
->
avctx
,
AV_LOG_INFO
,
"End of stream indicated.
\n
"
);
...
...
@@ -1123,18 +1127,18 @@ next_substr:
rematrix_channels
(
m
,
m
->
max_decoded_substream
);
if
(
output_data
(
m
,
m
->
max_decoded_substream
,
data
,
data_size
)
<
0
)
return
-
1
;
if
(
(
ret
=
output_data
(
m
,
m
->
max_decoded_substream
,
data
,
data_size
)
)
<
0
)
return
ret
;
return
length
;
substream_length_mismatch:
av_log
(
m
->
avctx
,
AV_LOG_ERROR
,
"substream %d length mismatch
\n
"
,
substr
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
error:
m
->
params_valid
=
0
;
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
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