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
bcd5d979
Commit
bcd5d979
authored
Jan 14, 2012
by
Daniel Huang
Committed by
Diego Biurrun
Jan 15, 2012
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mov, mxfdec: Employ more meaningful return values.
Signed-off-by:
Diego Biurrun
<
diego@biurrun.de
>
parent
e2ff436e
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
95 additions
and
86 deletions
+95
-86
mov.c
libavformat/mov.c
+49
-44
mxfdec.c
libavformat/mxfdec.c
+46
-42
No files found.
libavformat/mov.c
View file @
bcd5d979
...
...
@@ -239,7 +239,7 @@ static int mov_read_udta_string(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if
(
!
key
)
return
0
;
if
(
atom
.
size
<
0
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
str_size
=
FFMIN3
(
sizeof
(
str
)
-
1
,
str_size
,
atom
.
size
);
...
...
@@ -380,7 +380,7 @@ static int mov_read_dref(MOVContext *c, AVIOContext *pb, MOVAtom atom)
avio_rb32
(
pb
);
// version + flags
entries
=
avio_rb32
(
pb
);
if
(
entries
>=
UINT_MAX
/
sizeof
(
*
sc
->
drefs
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
sc
->
drefs
=
av_mallocz
(
entries
*
sizeof
(
*
sc
->
drefs
));
if
(
!
sc
->
drefs
)
return
AVERROR
(
ENOMEM
);
...
...
@@ -392,7 +392,7 @@ static int mov_read_dref(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int64_t
next
=
avio_tell
(
pb
)
+
size
-
4
;
if
(
size
<
12
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
dref
->
type
=
avio_rl32
(
pb
);
avio_rb32
(
pb
);
// version + flags
...
...
@@ -673,7 +673,7 @@ static int mov_read_ftyp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
comp_brand_size
=
atom
.
size
-
8
;
if
(
comp_brand_size
<
0
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
comp_brands_str
=
av_malloc
(
comp_brand_size
+
1
);
/* Add null terminator */
if
(
!
comp_brands_str
)
return
AVERROR
(
ENOMEM
);
...
...
@@ -688,8 +688,10 @@ static int mov_read_ftyp(MOVContext *c, AVIOContext *pb, MOVAtom atom)
/* this atom should contain all header atoms */
static
int
mov_read_moov
(
MOVContext
*
c
,
AVIOContext
*
pb
,
MOVAtom
atom
)
{
if
(
mov_read_default
(
c
,
pb
,
atom
)
<
0
)
return
-
1
;
int
ret
;
if
((
ret
=
mov_read_default
(
c
,
pb
,
atom
))
<
0
)
return
ret
;
/* we parsed the 'moov' atom, we can terminate the parsing as soon as we find the 'mdat' */
/* so we don't parse the whole file if over a network */
c
->
found_moov
=
1
;
...
...
@@ -731,9 +733,10 @@ static int mov_read_mdhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
sc
=
st
->
priv_data
;
version
=
avio_r8
(
pb
);
if
(
version
>
1
)
return
-
1
;
/* unsupported */
if
(
version
>
1
)
{
av_log_ask_for_sample
(
c
,
"unsupported version %d
\n
"
,
version
);
return
AVERROR_PATCHWELCOME
;
}
avio_rb24
(
pb
);
/* flags */
if
(
version
==
1
)
{
creation_time
=
avio_rb64
(
pb
);
...
...
@@ -802,7 +805,7 @@ static int mov_read_smi(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st
=
c
->
fc
->
streams
[
c
->
fc
->
nb_streams
-
1
];
if
((
uint64_t
)
atom
.
size
>
(
1
<<
30
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
// currently SVQ3 decoder expect full STSD header - so let's fake it
// this should be fixed and just SMI header should be passed
...
...
@@ -895,10 +898,10 @@ static int mov_read_extradata(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st
=
c
->
fc
->
streams
[
c
->
fc
->
nb_streams
-
1
];
size
=
(
uint64_t
)
st
->
codec
->
extradata_size
+
atom
.
size
+
8
+
FF_INPUT_BUFFER_PADDING_SIZE
;
if
(
size
>
INT_MAX
||
(
uint64_t
)
atom
.
size
>
INT_MAX
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
buf
=
av_realloc
(
st
->
codec
->
extradata
,
size
);
if
(
!
buf
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
st
->
codec
->
extradata
=
buf
;
buf
+=
st
->
codec
->
extradata_size
;
st
->
codec
->
extradata_size
=
size
-
FF_INPUT_BUFFER_PADDING_SIZE
;
...
...
@@ -917,7 +920,7 @@ static int mov_read_wave(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st
=
c
->
fc
->
streams
[
c
->
fc
->
nb_streams
-
1
];
if
((
uint64_t
)
atom
.
size
>
(
1
<<
30
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
st
->
codec
->
codec_id
==
CODEC_ID_QDM2
||
st
->
codec
->
codec_id
==
CODEC_ID_QDMC
)
{
// pass all frma atom to codec, needed at least for QDMC and QDM2
...
...
@@ -928,8 +931,9 @@ static int mov_read_wave(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st
->
codec
->
extradata_size
=
atom
.
size
;
avio_read
(
pb
,
st
->
codec
->
extradata
,
atom
.
size
);
}
else
if
(
atom
.
size
>
8
)
{
/* to read frma, esds atoms */
if
(
mov_read_default
(
c
,
pb
,
atom
)
<
0
)
return
-
1
;
int
ret
;
if
((
ret
=
mov_read_default
(
c
,
pb
,
atom
))
<
0
)
return
ret
;
}
else
avio_skip
(
pb
,
atom
.
size
);
return
0
;
...
...
@@ -948,7 +952,7 @@ static int mov_read_glbl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st
=
c
->
fc
->
streams
[
c
->
fc
->
nb_streams
-
1
];
if
((
uint64_t
)
atom
.
size
>
(
1
<<
30
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
atom
.
size
>=
10
)
{
// Broken files created by legacy versions of Libav and FFmpeg will
...
...
@@ -984,7 +988,7 @@ static int mov_read_strf(MOVContext *c, AVIOContext *pb, MOVAtom atom)
st
=
c
->
fc
->
streams
[
c
->
fc
->
nb_streams
-
1
];
if
((
uint64_t
)
atom
.
size
>
(
1
<<
30
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
av_free
(
st
->
codec
->
extradata
);
st
->
codec
->
extradata
=
av_mallocz
(
atom
.
size
-
40
+
FF_INPUT_BUFFER_PADDING_SIZE
);
...
...
@@ -1015,7 +1019,7 @@ static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if
(
!
entries
)
return
0
;
if
(
entries
>=
UINT_MAX
/
sizeof
(
int64_t
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
sc
->
chunk_offsets
=
av_malloc
(
entries
*
sizeof
(
int64_t
));
if
(
!
sc
->
chunk_offsets
)
...
...
@@ -1029,7 +1033,7 @@ static int mov_read_stco(MOVContext *c, AVIOContext *pb, MOVAtom atom)
for
(
i
=
0
;
i
<
entries
;
i
++
)
sc
->
chunk_offsets
[
i
]
=
avio_rb64
(
pb
);
else
return
-
1
;
return
AVERROR_INVALIDDATA
;
return
0
;
}
...
...
@@ -1338,8 +1342,9 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
/* this will read extra atoms at the end (wave, alac, damr, avcC, SMI ...) */
a
.
size
=
size
-
(
avio_tell
(
pb
)
-
start_pos
);
if
(
a
.
size
>
8
)
{
if
(
mov_read_default
(
c
,
pb
,
a
)
<
0
)
return
-
1
;
int
ret
;
if
((
ret
=
mov_read_default
(
c
,
pb
,
a
))
<
0
)
return
ret
;
}
else
if
(
a
.
size
>
0
)
avio_skip
(
pb
,
a
.
size
);
}
...
...
@@ -1355,7 +1360,7 @@ int ff_mov_read_stsd_entries(MOVContext *c, AVIOContext *pb, int entries)
c
->
dv_demux
=
avpriv_dv_init_demux
(
c
->
dv_fctx
);
if
(
!
c
->
dv_demux
)
{
av_log
(
c
->
fc
,
AV_LOG_ERROR
,
"dv demux context init error
\n
"
);
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
}
sc
->
dv_audio_container
=
1
;
st
->
codec
->
codec_id
=
CODEC_ID_PCM_S16LE
;
...
...
@@ -1438,7 +1443,7 @@ static int mov_read_stsc(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if
(
!
entries
)
return
0
;
if
(
entries
>=
UINT_MAX
/
sizeof
(
*
sc
->
stsc_data
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
sc
->
stsc_data
=
av_malloc
(
entries
*
sizeof
(
*
sc
->
stsc_data
));
if
(
!
sc
->
stsc_data
)
return
AVERROR
(
ENOMEM
);
...
...
@@ -1467,7 +1472,7 @@ static int mov_read_stps(MOVContext *c, AVIOContext *pb, MOVAtom atom)
entries
=
avio_rb32
(
pb
);
if
(
entries
>=
UINT_MAX
/
sizeof
(
*
sc
->
stps_data
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
sc
->
stps_data
=
av_malloc
(
entries
*
sizeof
(
*
sc
->
stps_data
));
if
(
!
sc
->
stps_data
)
return
AVERROR
(
ENOMEM
);
...
...
@@ -1500,7 +1505,7 @@ static int mov_read_stss(MOVContext *c, AVIOContext *pb, MOVAtom atom)
av_dlog
(
c
->
fc
,
"keyframe_count = %d
\n
"
,
entries
);
if
(
entries
>=
UINT_MAX
/
sizeof
(
int
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
sc
->
keyframes
=
av_malloc
(
entries
*
sizeof
(
int
));
if
(
!
sc
->
keyframes
)
return
AVERROR
(
ENOMEM
);
...
...
@@ -1549,13 +1554,13 @@ static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if
(
field_size
!=
4
&&
field_size
!=
8
&&
field_size
!=
16
&&
field_size
!=
32
)
{
av_log
(
c
->
fc
,
AV_LOG_ERROR
,
"Invalid sample field size %d
\n
"
,
field_size
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
!
entries
)
return
0
;
if
(
entries
>=
UINT_MAX
/
sizeof
(
int
)
||
entries
>=
(
UINT_MAX
-
4
)
/
field_size
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
sc
->
sample_sizes
=
av_malloc
(
entries
*
sizeof
(
int
));
if
(
!
sc
->
sample_sizes
)
return
AVERROR
(
ENOMEM
);
...
...
@@ -1571,7 +1576,7 @@ static int mov_read_stsz(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if
(
avio_read
(
pb
,
buf
,
num_bytes
)
<
num_bytes
)
{
av_freep
(
&
sc
->
sample_sizes
);
av_free
(
buf
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
init_get_bits
(
&
gb
,
buf
,
8
*
num_bytes
);
...
...
@@ -1656,7 +1661,7 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
if
(
!
entries
)
return
0
;
if
(
entries
>=
UINT_MAX
/
sizeof
(
*
sc
->
ctts_data
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
sc
->
ctts_data
=
av_malloc
(
entries
*
sizeof
(
*
sc
->
ctts_data
));
if
(
!
sc
->
ctts_data
)
return
AVERROR
(
ENOMEM
);
...
...
@@ -2120,7 +2125,7 @@ static int mov_read_tfhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
track_id
=
avio_rb32
(
pb
);
if
(
!
track_id
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
frag
->
track_id
=
track_id
;
for
(
i
=
0
;
i
<
c
->
trex_count
;
i
++
)
if
(
c
->
trex_data
[
i
].
track_id
==
frag
->
track_id
)
{
...
...
@@ -2129,7 +2134,7 @@ static int mov_read_tfhd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
}
if
(
!
trex
)
{
av_log
(
c
->
fc
,
AV_LOG_ERROR
,
"could not find corresponding trex
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
flags
&
0x01
)
frag
->
base_data_offset
=
avio_rb64
(
pb
);
...
...
@@ -2155,7 +2160,7 @@ static int mov_read_trex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
MOVTrackExt
*
trex
;
if
((
uint64_t
)
c
->
trex_count
+
1
>=
UINT_MAX
/
sizeof
(
*
c
->
trex_data
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
trex
=
av_realloc
(
c
->
trex_data
,
(
c
->
trex_count
+
1
)
*
sizeof
(
*
c
->
trex_data
));
if
(
!
trex
)
return
AVERROR
(
ENOMEM
);
...
...
@@ -2191,7 +2196,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
}
if
(
!
st
)
{
av_log
(
c
->
fc
,
AV_LOG_ERROR
,
"could not find corresponding track id %d
\n
"
,
frag
->
track_id
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
sc
=
st
->
priv_data
;
if
(
sc
->
pseudo_stream_id
+
1
!=
frag
->
stsd_id
)
...
...
@@ -2218,7 +2223,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
sc
->
ctts_count
++
;
}
if
((
uint64_t
)
entries
+
sc
->
ctts_count
>=
UINT_MAX
/
sizeof
(
*
sc
->
ctts_data
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
ctts_data
=
av_realloc
(
sc
->
ctts_data
,
(
entries
+
sc
->
ctts_count
)
*
sizeof
(
*
sc
->
ctts_data
));
if
(
!
ctts_data
)
...
...
@@ -2294,14 +2299,14 @@ static int mov_read_cmov(MOVContext *c, AVIOContext *pb, MOVAtom atom)
avio_rb32
(
pb
);
/* dcom atom */
if
(
avio_rl32
(
pb
)
!=
MKTAG
(
'd'
,
'c'
,
'o'
,
'm'
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
avio_rl32
(
pb
)
!=
MKTAG
(
'z'
,
'l'
,
'i'
,
'b'
))
{
av_log
(
c
->
fc
,
AV_LOG_ERROR
,
"unknown compression for cmov atom !"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
avio_rb32
(
pb
);
/* cmvd atom */
if
(
avio_rl32
(
pb
)
!=
MKTAG
(
'c'
,
'm'
,
'v'
,
'd'
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
moov_len
=
avio_rb32
(
pb
);
/* uncompressed size */
cmov_len
=
atom
.
size
-
6
*
4
;
...
...
@@ -2327,7 +2332,7 @@ free_and_return:
return
ret
;
#else
av_log
(
c
->
fc
,
AV_LOG_ERROR
,
"this file requires zlib support compiled in
\n
"
);
return
-
1
;
return
AVERROR
(
ENOSYS
)
;
#endif
}
...
...
@@ -2346,7 +2351,7 @@ static int mov_read_elst(MOVContext *c, AVIOContext *pb, MOVAtom atom)
edit_count
=
avio_rb32
(
pb
);
/* entries */
if
((
uint64_t
)
edit_count
*
12
+
8
>
atom
.
size
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
for
(
i
=
0
;
i
<
edit_count
;
i
++
){
int64_t
time
;
...
...
@@ -2565,7 +2570,7 @@ static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap)
}
if
(
!
mov
->
found_moov
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"moov atom not found
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
av_dlog
(
mov
->
fc
,
"on_parse_exit_offset=%"
PRId64
"
\n
"
,
avio_tell
(
pb
));
...
...
@@ -2627,7 +2632,7 @@ static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
if
(
avio_seek
(
sc
->
pb
,
sample
->
pos
,
SEEK_SET
)
!=
sample
->
pos
)
{
av_log
(
mov
->
fc
,
AV_LOG_ERROR
,
"stream %d, offset 0x%"
PRIx64
": partial file
\n
"
,
sc
->
ffindex
,
sample
->
pos
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
ret
=
av_get_packet
(
sc
->
pb
,
pkt
,
sample
->
size
);
if
(
ret
<
0
)
...
...
@@ -2694,7 +2699,7 @@ static int mov_seek_stream(AVFormatContext *s, AVStream *st, int64_t timestamp,
if
(
sample
<
0
&&
st
->
nb_index_entries
&&
timestamp
<
st
->
index_entries
[
0
].
timestamp
)
sample
=
0
;
if
(
sample
<
0
)
/* not sure what to do */
return
-
1
;
return
AVERROR_INVALIDDATA
;
sc
->
current_sample
=
sample
;
av_dlog
(
s
,
"stream %d, found sample %d
\n
"
,
st
->
index
,
sc
->
current_sample
);
/* adjust ctts index */
...
...
@@ -2721,14 +2726,14 @@ static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti
int
i
;
if
(
stream_index
>=
s
->
nb_streams
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
sample_time
<
0
)
sample_time
=
0
;
st
=
s
->
streams
[
stream_index
];
sample
=
mov_seek_stream
(
s
,
st
,
sample_time
,
flags
);
if
(
sample
<
0
)
return
-
1
;
return
sample
;
/* adjust seek timestamp to found sample timestamp */
seek_timestamp
=
st
->
index_entries
[
sample
].
timestamp
;
...
...
libavformat/mxfdec.c
View file @
bcd5d979
...
...
@@ -170,7 +170,7 @@ static int64_t klv_decode_ber_length(AVIOContext *pb)
int
bytes_num
=
size
&
0x7f
;
/* SMPTE 379M 5.3.4 guarantee that bytes_num must not exceed 8 bytes */
if
(
bytes_num
>
8
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
size
=
0
;
while
(
bytes_num
--
)
size
=
size
<<
8
|
avio_r8
(
pb
);
...
...
@@ -194,7 +194,7 @@ static int mxf_read_sync(AVIOContext *pb, const uint8_t *key, unsigned size)
static
int
klv_read_packet
(
KLVPacket
*
klv
,
AVIOContext
*
pb
)
{
if
(
!
mxf_read_sync
(
pb
,
mxf_klv_key
,
4
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
klv
->
offset
=
avio_tell
(
pb
)
-
4
;
memcpy
(
klv
->
key
,
mxf_klv_key
,
4
);
avio_read
(
pb
,
klv
->
key
+
4
,
12
);
...
...
@@ -224,7 +224,7 @@ static int mxf_get_d10_aes3_packet(AVIOContext *pb, AVStream *st, AVPacket *pkt,
int
i
;
if
(
length
>
61444
)
/* worst case PAL 1920 samples 8 channels */
return
-
1
;
return
AVERROR_INVALIDDATA
;
length
=
av_get_packet
(
pb
,
pkt
,
length
);
if
(
length
<
0
)
return
length
;
...
...
@@ -261,7 +261,7 @@ static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv
if
(
!
mxf
->
aesc
&&
s
->
key
&&
s
->
keylen
==
16
)
{
mxf
->
aesc
=
av_malloc
(
av_aes_size
);
if
(
!
mxf
->
aesc
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
av_aes_init
(
mxf
->
aesc
,
s
->
key
,
128
,
1
);
}
// crypto context
...
...
@@ -273,19 +273,19 @@ static int mxf_decrypt_triplet(AVFormatContext *s, AVPacket *pkt, KLVPacket *klv
klv_decode_ber_length
(
pb
);
avio_read
(
pb
,
klv
->
key
,
16
);
if
(
!
IS_KLV_KEY
(
klv
,
mxf_essence_element_key
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
index
=
mxf_get_stream_index
(
s
,
klv
);
if
(
index
<
0
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
// source size
klv_decode_ber_length
(
pb
);
orig_size
=
avio_rb64
(
pb
);
if
(
orig_size
<
plaintext_size
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
// enc. code
size
=
klv_decode_ber_length
(
pb
);
if
(
size
<
32
||
size
-
32
<
orig_size
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
avio_read
(
pb
,
ivec
,
16
);
avio_read
(
pb
,
tmpbuf
,
16
);
if
(
mxf
->
aesc
)
...
...
@@ -313,15 +313,16 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
KLVPacket
klv
;
while
(
!
s
->
pb
->
eof_reached
)
{
int
ret
;
if
(
klv_read_packet
(
&
klv
,
s
->
pb
)
<
0
)
return
-
1
;
PRINT_KEY
(
s
,
"read packet"
,
klv
.
key
);
av_dlog
(
s
,
"size %"
PRIu64
" offset %#"
PRIx64
"
\n
"
,
klv
.
length
,
klv
.
offset
);
if
(
IS_KLV_KEY
(
klv
.
key
,
mxf_encrypted_triplet_key
))
{
int
res
=
mxf_decrypt_triplet
(
s
,
pkt
,
&
klv
);
if
(
re
s
<
0
)
{
ret
=
mxf_decrypt_triplet
(
s
,
pkt
,
&
klv
);
if
(
re
t
<
0
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"invalid encoded triplet
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
return
0
;
}
...
...
@@ -337,10 +338,10 @@ static int mxf_read_packet(AVFormatContext *s, AVPacket *pkt)
if
(
klv
.
key
[
12
]
==
0x06
&&
klv
.
key
[
13
]
==
0x01
&&
klv
.
key
[
14
]
==
0x10
)
{
if
(
mxf_get_d10_aes3_packet
(
s
->
pb
,
s
->
streams
[
index
],
pkt
,
klv
.
length
)
<
0
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"error reading D-10 aes3 frame
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
}
else
{
int
ret
=
av_get_packet
(
s
->
pb
,
pkt
,
klv
.
length
);
ret
=
av_get_packet
(
s
->
pb
,
pkt
,
klv
.
length
);
if
(
ret
<
0
)
return
ret
;
}
...
...
@@ -361,15 +362,16 @@ static int mxf_read_primer_pack(void *arg, AVIOContext *pb, int tag, int size, U
int
item_len
=
avio_rb32
(
pb
);
if
(
item_len
!=
18
)
{
av_log
(
mxf
->
fc
,
AV_LOG_ERROR
,
"unsupported primer pack item length
\n
"
);
return
-
1
;
av_log_ask_for_sample
(
pb
,
"unsupported primer pack item length %d
\n
"
,
item_len
);
return
AVERROR_PATCHWELCOME
;
}
if
(
item_num
>
UINT_MAX
/
item_len
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
mxf
->
local_tags_count
=
item_num
;
mxf
->
local_tags
=
av_malloc
(
item_num
*
item_len
);
if
(
!
mxf
->
local_tags
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
avio_read
(
pb
,
mxf
->
local_tags
,
item_num
*
item_len
);
return
0
;
}
...
...
@@ -380,7 +382,7 @@ static int mxf_add_metadata_set(MXFContext *mxf, void *metadata_set)
return
AVERROR
(
ENOMEM
);
mxf
->
metadata_sets
=
av_realloc
(
mxf
->
metadata_sets
,
(
mxf
->
metadata_sets_count
+
1
)
*
sizeof
(
*
mxf
->
metadata_sets
));
if
(
!
mxf
->
metadata_sets
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
mxf
->
metadata_sets
[
mxf
->
metadata_sets_count
]
=
metadata_set
;
mxf
->
metadata_sets_count
++
;
return
0
;
...
...
@@ -390,7 +392,7 @@ static int mxf_read_cryptographic_context(void *arg, AVIOContext *pb, int tag, i
{
MXFCryptoContext
*
cryptocontext
=
arg
;
if
(
size
!=
16
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
IS_KLV_KEY
(
uid
,
mxf_crypto_source_container_ul
))
avio_read
(
pb
,
cryptocontext
->
source_container_ul
,
16
);
return
0
;
...
...
@@ -403,10 +405,10 @@ static int mxf_read_content_storage(void *arg, AVIOContext *pb, int tag, int siz
case
0x1901
:
mxf
->
packages_count
=
avio_rb32
(
pb
);
if
(
mxf
->
packages_count
>=
UINT_MAX
/
sizeof
(
UID
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
mxf
->
packages_refs
=
av_malloc
(
mxf
->
packages_count
*
sizeof
(
UID
));
if
(
!
mxf
->
packages_refs
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
avio_skip
(
pb
,
4
);
/* useless size of objects, always 16 according to specs */
avio_read
(
pb
,
(
uint8_t
*
)
mxf
->
packages_refs
,
mxf
->
packages_count
*
sizeof
(
UID
));
break
;
...
...
@@ -443,10 +445,10 @@ static int mxf_read_material_package(void *arg, AVIOContext *pb, int tag, int si
case
0x4403
:
package
->
tracks_count
=
avio_rb32
(
pb
);
if
(
package
->
tracks_count
>=
UINT_MAX
/
sizeof
(
UID
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
package
->
tracks_refs
=
av_malloc
(
package
->
tracks_count
*
sizeof
(
UID
));
if
(
!
package
->
tracks_refs
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
avio_skip
(
pb
,
4
);
/* useless size of objects, always 16 according to specs */
avio_read
(
pb
,
(
uint8_t
*
)
package
->
tracks_refs
,
package
->
tracks_count
*
sizeof
(
UID
));
break
;
...
...
@@ -488,10 +490,10 @@ static int mxf_read_sequence(void *arg, AVIOContext *pb, int tag, int size, UID
case
0x1001
:
sequence
->
structural_components_count
=
avio_rb32
(
pb
);
if
(
sequence
->
structural_components_count
>=
UINT_MAX
/
sizeof
(
UID
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
sequence
->
structural_components_refs
=
av_malloc
(
sequence
->
structural_components_count
*
sizeof
(
UID
));
if
(
!
sequence
->
structural_components_refs
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
avio_skip
(
pb
,
4
);
/* useless size of objects, always 16 according to specs */
avio_read
(
pb
,
(
uint8_t
*
)
sequence
->
structural_components_refs
,
sequence
->
structural_components_count
*
sizeof
(
UID
));
break
;
...
...
@@ -506,10 +508,10 @@ static int mxf_read_source_package(void *arg, AVIOContext *pb, int tag, int size
case
0x4403
:
package
->
tracks_count
=
avio_rb32
(
pb
);
if
(
package
->
tracks_count
>=
UINT_MAX
/
sizeof
(
UID
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
package
->
tracks_refs
=
av_malloc
(
package
->
tracks_count
*
sizeof
(
UID
));
if
(
!
package
->
tracks_refs
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
avio_skip
(
pb
,
4
);
/* useless size of objects, always 16 according to specs */
avio_read
(
pb
,
(
uint8_t
*
)
package
->
tracks_refs
,
package
->
tracks_count
*
sizeof
(
UID
));
break
;
...
...
@@ -564,10 +566,10 @@ static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int
case
0x3F01
:
descriptor
->
sub_descriptors_count
=
avio_rb32
(
pb
);
if
(
descriptor
->
sub_descriptors_count
>=
UINT_MAX
/
sizeof
(
UID
))
return
-
1
;
return
AVERROR_INVALIDDATA
;
descriptor
->
sub_descriptors_refs
=
av_malloc
(
descriptor
->
sub_descriptors_count
*
sizeof
(
UID
));
if
(
!
descriptor
->
sub_descriptors_refs
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
avio_skip
(
pb
,
4
);
/* useless size of objects, always 16 according to specs */
avio_read
(
pb
,
(
uint8_t
*
)
descriptor
->
sub_descriptors_refs
,
descriptor
->
sub_descriptors_count
*
sizeof
(
UID
));
break
;
...
...
@@ -611,7 +613,7 @@ static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int
if
(
IS_KLV_KEY
(
uid
,
mxf_sony_mpeg4_extradata
))
{
descriptor
->
extradata
=
av_malloc
(
size
+
FF_INPUT_BUFFER_PADDING_SIZE
);
if
(
!
descriptor
->
extradata
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
descriptor
->
extradata_size
=
size
;
avio_read
(
pb
,
descriptor
->
extradata
,
size
);
}
...
...
@@ -684,7 +686,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
}
if
(
!
material_package
)
{
av_log
(
mxf
->
fc
,
AV_LOG_ERROR
,
"no material package found
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
for
(
i
=
0
;
i
<
material_package
->
tracks_count
;
i
++
)
{
...
...
@@ -732,7 +734,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
for
(
k
=
0
;
k
<
source_package
->
tracks_count
;
k
++
)
{
if
(
!
(
temp_track
=
mxf_resolve_strong_ref
(
mxf
,
&
source_package
->
tracks_refs
[
k
],
Track
)))
{
av_log
(
mxf
->
fc
,
AV_LOG_ERROR
,
"could not resolve source track strong ref
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
if
(
temp_track
->
track_id
==
component
->
source_track_id
)
{
source_track
=
temp_track
;
...
...
@@ -750,7 +752,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
st
=
avformat_new_stream
(
mxf
->
fc
,
NULL
);
if
(
!
st
)
{
av_log
(
mxf
->
fc
,
AV_LOG_ERROR
,
"could not allocate stream
\n
"
);
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
}
st
->
id
=
source_track
->
track_id
;
st
->
priv_data
=
source_track
;
...
...
@@ -762,7 +764,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
if
(
!
(
source_track
->
sequence
=
mxf_resolve_strong_ref
(
mxf
,
&
source_track
->
sequence_ref
,
Sequence
)))
{
av_log
(
mxf
->
fc
,
AV_LOG_ERROR
,
"could not resolve source track sequence strong ref
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
PRINT_KEY
(
mxf
->
fc
,
"data definition ul"
,
source_track
->
sequence
->
data_definition_ul
);
...
...
@@ -880,8 +882,9 @@ static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadF
uint64_t
klv_end
=
avio_tell
(
pb
)
+
klv
->
length
;
if
(
!
ctx
)
return
-
1
;
return
AVERROR
(
ENOMEM
)
;
while
(
avio_tell
(
pb
)
+
4
<
klv_end
)
{
int
ret
;
int
tag
=
avio_rb16
(
pb
);
int
size
=
avio_rb16
(
pb
);
/* KLV specified by 0x53 */
uint64_t
next
=
avio_tell
(
pb
)
+
size
;
...
...
@@ -905,8 +908,8 @@ static int mxf_read_local_tags(MXFContext *mxf, KLVPacket *klv, MXFMetadataReadF
}
if
(
ctx_size
&&
tag
==
0x3C0A
)
avio_read
(
pb
,
ctx
->
uid
,
16
);
else
if
(
read_child
(
ctx
,
pb
,
tag
,
size
,
uid
)
<
0
)
return
-
1
;
else
if
(
(
ret
=
read_child
(
ctx
,
pb
,
tag
,
size
,
uid
)
)
<
0
)
return
ret
;
avio_seek
(
pb
,
next
,
SEEK_SET
);
}
...
...
@@ -921,15 +924,16 @@ static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap)
if
(
!
mxf_read_sync
(
s
->
pb
,
mxf_header_partition_pack_key
,
14
))
{
av_log
(
s
,
AV_LOG_ERROR
,
"could not find header partition pack key
\n
"
);
return
-
1
;
return
AVERROR_INVALIDDATA
;
}
avio_seek
(
s
->
pb
,
-
14
,
SEEK_CUR
);
mxf
->
fc
=
s
;
while
(
!
s
->
pb
->
eof_reached
)
{
int
ret
;
const
MXFMetadataReadTableEntry
*
metadata
;
if
(
klv_read_packet
(
&
klv
,
s
->
pb
)
<
0
)
return
-
1
;
if
(
(
ret
=
klv_read_packet
(
&
klv
,
s
->
pb
)
)
<
0
)
return
ret
;
PRINT_KEY
(
s
,
"read header"
,
klv
.
key
);
av_dlog
(
s
,
"size %"
PRIu64
" offset %#"
PRIx64
"
\n
"
,
klv
.
length
,
klv
.
offset
);
if
(
IS_KLV_KEY
(
klv
.
key
,
mxf_encrypted_triplet_key
)
||
...
...
@@ -948,7 +952,7 @@ static int mxf_read_header(AVFormatContext *s, AVFormatParameters *ap)
res
=
metadata
->
read
(
mxf
,
s
->
pb
,
0
,
0
,
NULL
);
if
(
res
<
0
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"error reading header metadata
\n
"
);
return
-
1
;
return
res
;
}
break
;
}
...
...
@@ -1016,7 +1020,7 @@ static int mxf_read_seek(AVFormatContext *s, int stream_index, int64_t sample_ti
int64_t
seconds
;
if
(
!
s
->
bit_rate
)
return
-
1
;
return
AVERROR_INVALIDDATA
;
if
(
sample_time
<
0
)
sample_time
=
0
;
seconds
=
av_rescale
(
sample_time
,
st
->
time_base
.
num
,
st
->
time_base
.
den
);
...
...
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