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
8c93269e
Commit
8c93269e
authored
Nov 03, 2012
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
asfdec: correctly parse payload extensions
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
2d8c76eb
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
39 additions
and
11 deletions
+39
-11
asfdec.c
libavformat/asfdec.c
+39
-11
No files found.
libavformat/asfdec.c
View file @
8c93269e
...
@@ -926,13 +926,16 @@ static int ff_asf_get_packet(AVFormatContext *s, AVIOContext *pb)
...
@@ -926,13 +926,16 @@ static int ff_asf_get_packet(AVFormatContext *s, AVIOContext *pb)
*/
*/
static
int
asf_read_frame_header
(
AVFormatContext
*
s
,
AVIOContext
*
pb
){
static
int
asf_read_frame_header
(
AVFormatContext
*
s
,
AVIOContext
*
pb
){
ASFContext
*
asf
=
s
->
priv_data
;
ASFContext
*
asf
=
s
->
priv_data
;
ASFStream
*
asfst
;
int
rsize
=
1
;
int
rsize
=
1
;
int
num
=
avio_r8
(
pb
);
int
num
=
avio_r8
(
pb
);
int
i
;
int64_t
ts0
,
ts1
av_unused
;
int64_t
ts0
,
ts1
av_unused
;
asf
->
packet_segments
--
;
asf
->
packet_segments
--
;
asf
->
packet_key_frame
=
num
>>
7
;
asf
->
packet_key_frame
=
num
>>
7
;
asf
->
stream_index
=
asf
->
asfid2avid
[
num
&
0x7f
];
asf
->
stream_index
=
asf
->
asfid2avid
[
num
&
0x7f
];
asfst
=
&
asf
->
streams
[
num
&
0x7f
];
// sequence should be ignored!
// sequence should be ignored!
DO_2BITS
(
asf
->
packet_property
>>
4
,
asf
->
packet_seq
,
0
);
DO_2BITS
(
asf
->
packet_property
>>
4
,
asf
->
packet_seq
,
0
);
DO_2BITS
(
asf
->
packet_property
>>
2
,
asf
->
packet_frag_offset
,
0
);
DO_2BITS
(
asf
->
packet_property
>>
2
,
asf
->
packet_frag_offset
,
0
);
...
@@ -945,23 +948,48 @@ static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb){
...
@@ -945,23 +948,48 @@ static int asf_read_frame_header(AVFormatContext *s, AVIOContext *pb){
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
asf
->
packet_replic_size
>=
8
)
{
if
(
asf
->
packet_replic_size
>=
8
)
{
int64_t
end
=
avio_tell
(
pb
)
+
asf
->
packet_replic_size
;
asf
->
packet_obj_size
=
avio_rl32
(
pb
);
asf
->
packet_obj_size
=
avio_rl32
(
pb
);
if
(
asf
->
packet_obj_size
>=
(
1
<<
24
)
||
asf
->
packet_obj_size
<=
0
){
if
(
asf
->
packet_obj_size
>=
(
1
<<
24
)
||
asf
->
packet_obj_size
<=
0
){
av_log
(
s
,
AV_LOG_ERROR
,
"packet_obj_size invalid
\n
"
);
av_log
(
s
,
AV_LOG_ERROR
,
"packet_obj_size invalid
\n
"
);
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
}
}
asf
->
packet_frag_timestamp
=
avio_rl32
(
pb
);
// timestamp
asf
->
packet_frag_timestamp
=
avio_rl32
(
pb
);
// timestamp
if
(
asf
->
packet_replic_size
>=
8
+
38
+
4
){
avio_skip
(
pb
,
10
);
for
(
i
=
0
;
i
<
asfst
->
payload_ext_ct
;
i
++
)
{
ts0
=
avio_rl64
(
pb
);
ASFPayload
*
p
=
&
asfst
->
payload
[
i
];
ts1
=
avio_rl64
(
pb
);
int
size
=
p
->
size
;
avio_skip
(
pb
,
12
);
int64_t
payend
;
avio_rl32
(
pb
);
if
(
size
==
0xFFFF
)
avio_skip
(
pb
,
asf
->
packet_replic_size
-
8
-
38
-
4
);
size
=
avio_rl16
(
pb
);
if
(
ts0
!=
-
1
)
asf
->
packet_frag_timestamp
=
ts0
/
10000
;
payend
=
avio_tell
(
pb
)
+
size
;
else
asf
->
packet_frag_timestamp
=
AV_NOPTS_VALUE
;
if
(
payend
>
end
)
{
}
else
av_log
(
s
,
AV_LOG_ERROR
,
"too long payload
\n
"
);
avio_skip
(
pb
,
asf
->
packet_replic_size
-
8
);
break
;
}
switch
(
p
->
type
)
{
case
0x50
:
// duration = avio_rl16(pb);
break
;
case
0x2A
:
avio_skip
(
pb
,
8
);
ts0
=
avio_rl64
(
pb
);
ts1
=
avio_rl64
(
pb
);
if
(
ts0
!=
-
1
)
asf
->
packet_frag_timestamp
=
ts0
/
10000
;
else
asf
->
packet_frag_timestamp
=
AV_NOPTS_VALUE
;
break
;
case
0x5B
:
case
0xB7
:
case
0xCC
:
case
0xC0
:
case
0xA0
:
//unknown
break
;
}
avio_seek
(
pb
,
payend
,
SEEK_SET
);
}
avio_seek
(
pb
,
end
,
SEEK_SET
);
rsize
+=
asf
->
packet_replic_size
;
// FIXME - check validity
rsize
+=
asf
->
packet_replic_size
;
// FIXME - check validity
}
else
if
(
asf
->
packet_replic_size
==
1
){
}
else
if
(
asf
->
packet_replic_size
==
1
){
// multipacket - frag_offset is beginning timestamp
// multipacket - frag_offset is beginning timestamp
...
...
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