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
5b8f0a5e
Commit
5b8f0a5e
authored
Mar 20, 2014
by
Tanja Batchelor
Committed by
Vittorio Giovara
Mar 24, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mpeg: K&R formatting cosmetics
Signed-off-by:
Vittorio Giovara
<
vittorio.giovara@gmail.com
>
parent
f51d0f39
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
169 additions
and
141 deletions
+169
-141
mpeg.c
libavformat/mpeg.c
+169
-141
No files found.
libavformat/mpeg.c
View file @
5b8f0a5e
...
...
@@ -31,72 +31,89 @@
#define MAX_SYNC_SIZE 100000
static
int
check_pes
(
uint8_t
*
p
,
uint8_t
*
end
){
static
int
check_pes
(
uint8_t
*
p
,
uint8_t
*
end
)
{
int
pes1
;
int
pes2
=
(
p
[
3
]
&
0xC0
)
==
0x80
&&
(
p
[
4
]
&
0xC0
)
!=
0x40
&&
((
p
[
4
]
&
0xC0
)
==
0x00
||
(
p
[
4
]
&
0xC0
)
>>
2
==
(
p
[
6
]
&
0xF0
));
for
(
p
+=
3
;
p
<
end
&&
*
p
==
0xFF
;
p
++
);
if
((
*
p
&
0xC0
)
==
0x40
)
p
+=
2
;
if
((
*
p
&
0xF0
)
==
0x20
){
pes1
=
p
[
0
]
&
p
[
2
]
&
p
[
4
]
&
1
;
}
else
if
((
*
p
&
0xF0
)
==
0x30
){
pes1
=
p
[
0
]
&
p
[
2
]
&
p
[
4
]
&
p
[
5
]
&
p
[
7
]
&
p
[
9
]
&
1
;
}
else
int
pes2
=
(
p
[
3
]
&
0xC0
)
==
0x80
&&
(
p
[
4
]
&
0xC0
)
!=
0x40
&&
((
p
[
4
]
&
0xC0
)
==
0x00
||
(
p
[
4
]
&
0xC0
)
>>
2
==
(
p
[
6
]
&
0xF0
));
for
(
p
+=
3
;
p
<
end
&&
*
p
==
0xFF
;
p
++
)
;
if
((
*
p
&
0xC0
)
==
0x40
)
p
+=
2
;
if
((
*
p
&
0xF0
)
==
0x20
)
pes1
=
p
[
0
]
&
p
[
2
]
&
p
[
4
]
&
1
;
else
if
((
*
p
&
0xF0
)
==
0x30
)
pes1
=
p
[
0
]
&
p
[
2
]
&
p
[
4
]
&
p
[
5
]
&
p
[
7
]
&
p
[
9
]
&
1
;
else
pes1
=
*
p
==
0x0F
;
return
pes1
||
pes2
;
return
pes1
||
pes2
;
}
static
int
check_pack_header
(
const
uint8_t
*
buf
)
{
static
int
check_pack_header
(
const
uint8_t
*
buf
)
{
return
(
buf
[
1
]
&
0xC0
)
==
0x40
||
(
buf
[
1
]
&
0xF0
)
==
0x20
;
}
static
int
mpegps_probe
(
AVProbeData
*
p
)
{
uint32_t
code
=
-
1
;
int
sys
=
0
,
pspack
=
0
,
priv1
=
0
,
vid
=
0
,
audio
=
0
,
invalid
=
0
;
uint32_t
code
=
-
1
;
int
i
;
int
score
=
0
;
int
sys
=
0
,
pspack
=
0
,
priv1
=
0
,
vid
=
0
;
int
audio
=
0
,
invalid
=
0
,
score
=
0
;
for
(
i
=
0
;
i
<
p
->
buf_size
;
i
++
)
{
code
=
(
code
<<
8
)
+
p
->
buf
[
i
];
for
(
i
=
0
;
i
<
p
->
buf_size
;
i
++
)
{
code
=
(
code
<<
8
)
+
p
->
buf
[
i
];
if
((
code
&
0xffffff00
)
==
0x100
)
{
int
len
=
p
->
buf
[
i
+
1
]
<<
8
|
p
->
buf
[
i
+
2
];
int
pes
=
check_pes
(
p
->
buf
+
i
,
p
->
buf
+
p
->
buf_size
);
int
pack
=
check_pack_header
(
p
->
buf
+
i
);
if
(
code
==
SYSTEM_HEADER_START_CODE
)
sys
++
;
else
if
(
code
==
PACK_START_CODE
&&
pack
)
pspack
++
;
else
if
((
code
&
0xf0
)
==
VIDEO_ID
&&
pes
)
vid
++
;
int
len
=
p
->
buf
[
i
+
1
]
<<
8
|
p
->
buf
[
i
+
2
];
int
pes
=
check_pes
(
p
->
buf
+
i
,
p
->
buf
+
p
->
buf_size
);
int
pack
=
check_pack_header
(
p
->
buf
+
i
);
if
(
code
==
SYSTEM_HEADER_START_CODE
)
sys
++
;
else
if
(
code
==
PACK_START_CODE
&&
pack
)
pspack
++
;
else
if
((
code
&
0xf0
)
==
VIDEO_ID
&&
pes
)
vid
++
;
// skip pes payload to avoid start code emulation for private
// and audio streams
else
if
((
code
&
0xe0
)
==
AUDIO_ID
&&
pes
)
{
audio
++
;
i
+=
len
;}
else
if
(
code
==
PRIVATE_STREAM_1
&&
pes
)
{
priv1
++
;
i
+=
len
;}
else
if
((
code
&
0xf0
)
==
VIDEO_ID
&&
!
pes
)
invalid
++
;
else
if
((
code
&
0xe0
)
==
AUDIO_ID
&&
!
pes
)
invalid
++
;
else
if
(
code
==
PRIVATE_STREAM_1
&&
!
pes
)
invalid
++
;
else
if
((
code
&
0xe0
)
==
AUDIO_ID
&&
pes
)
{
audio
++
;
i
+=
len
;
}
else
if
(
code
==
PRIVATE_STREAM_1
&&
pes
)
{
priv1
++
;
i
+=
len
;
}
else
if
((
code
&
0xf0
)
==
VIDEO_ID
&&
!
pes
)
invalid
++
;
else
if
((
code
&
0xe0
)
==
AUDIO_ID
&&
!
pes
)
invalid
++
;
else
if
(
code
==
PRIVATE_STREAM_1
&&
!
pes
)
invalid
++
;
}
}
if
(
vid
+
audio
>
invalid
)
/* invalid VDR files nd short PES streams */
if
(
vid
+
audio
>
invalid
)
/* invalid VDR files nd short PES streams */
score
=
AVPROBE_SCORE_EXTENSION
/
2
;
if
(
sys
>
invalid
&&
sys
*
9
<=
pspack
*
10
)
return
pspack
>
2
?
AVPROBE_SCORE_EXTENSION
+
2
:
AVPROBE_SCORE_EXTENSION
/
2
;
// 1 more than .mpg
if
(
pspack
>
invalid
&&
(
priv1
+
vid
+
audio
)
*
10
>=
pspack
*
9
)
return
pspack
>
2
?
AVPROBE_SCORE_EXTENSION
+
2
:
AVPROBE_SCORE_EXTENSION
/
2
;
// 1 more than .mpg
if
((
!!
vid
^
!!
audio
)
&&
(
audio
>
4
||
vid
>
1
)
&&
!
sys
&&
!
pspack
&&
p
->
buf_size
>
2048
&&
vid
+
audio
>
invalid
)
/* PES stream */
return
(
audio
>
12
||
vid
>
3
)
?
AVPROBE_SCORE_EXTENSION
+
2
:
AVPROBE_SCORE_EXTENSION
/
2
;
//02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
//mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
if
(
sys
>
invalid
&&
sys
*
9
<=
pspack
*
10
)
return
pspack
>
2
?
AVPROBE_SCORE_EXTENSION
+
2
:
AVPROBE_SCORE_EXTENSION
/
2
;
// 1 more than .mpg
if
(
pspack
>
invalid
&&
(
priv1
+
vid
+
audio
)
*
10
>=
pspack
*
9
)
return
pspack
>
2
?
AVPROBE_SCORE_EXTENSION
+
2
:
AVPROBE_SCORE_EXTENSION
/
2
;
// 1 more than .mpg
if
((
!!
vid
^
!!
audio
)
&&
(
audio
>
4
||
vid
>
1
)
&&
!
sys
&&
!
pspack
&&
p
->
buf_size
>
2048
&&
vid
+
audio
>
invalid
)
/* PES stream */
return
(
audio
>
12
||
vid
>
3
)
?
AVPROBE_SCORE_EXTENSION
+
2
:
AVPROBE_SCORE_EXTENSION
/
2
;
// 02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
// mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
return
score
;
}
typedef
struct
MpegDemuxContext
{
int32_t
header_state
;
unsigned
char
psm_es_type
[
256
];
...
...
@@ -106,11 +123,11 @@ typedef struct MpegDemuxContext {
static
int
mpegps_read_header
(
AVFormatContext
*
s
)
{
MpegDemuxContext
*
m
=
s
->
priv_data
;
const
char
*
sofdec
=
"Sofdec"
;
const
char
*
sofdec
=
"Sofdec"
;
int
v
,
i
=
0
;
m
->
header_state
=
0xff
;
s
->
ctx_flags
|=
AVFMTCTX_NOHEADER
;
s
->
ctx_flags
|=
AVFMTCTX_NOHEADER
;
m
->
sofdec
=
-
1
;
do
{
...
...
@@ -129,8 +146,8 @@ static int64_t get_pts(AVIOContext *pb, int c)
{
uint8_t
buf
[
5
];
buf
[
0
]
=
c
<
0
?
avio_r8
(
pb
)
:
c
;
avio_read
(
pb
,
buf
+
1
,
4
);
buf
[
0
]
=
c
<
0
?
avio_r8
(
pb
)
:
c
;
avio_read
(
pb
,
buf
+
1
,
4
);
return
ff_parse_pes_pts
(
buf
);
}
...
...
@@ -142,7 +159,7 @@ static int find_next_start_code(AVIOContext *pb, int *size_ptr,
int
val
,
n
;
state
=
*
header_state
;
n
=
*
size_ptr
;
n
=
*
size_ptr
;
while
(
n
>
0
)
{
if
(
pb
->
eof_reached
)
break
;
...
...
@@ -150,15 +167,16 @@ static int find_next_start_code(AVIOContext *pb, int *size_ptr,
n
--
;
if
(
state
==
0x000001
)
{
state
=
((
state
<<
8
)
|
v
)
&
0xffffff
;
val
=
state
;
val
=
state
;
goto
found
;
}
state
=
((
state
<<
8
)
|
v
)
&
0xffffff
;
}
val
=
-
1
;
found:
found:
*
header_state
=
state
;
*
size_ptr
=
n
;
*
size_ptr
=
n
;
return
val
;
}
...
...
@@ -182,10 +200,11 @@ static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb)
es_map_length
=
avio_rb16
(
pb
);
/* at least one es available? */
while
(
es_map_length
>=
4
){
while
(
es_map_length
>=
4
)
{
unsigned
char
type
=
avio_r8
(
pb
);
unsigned
char
es_id
=
avio_r8
(
pb
);
uint16_t
es_info_length
=
avio_rb16
(
pb
);
/* remember mapping from stream id to stream type */
m
->
psm_es_type
[
es_id
]
=
type
;
/* skip program_stream_info */
...
...
@@ -197,7 +216,7 @@ static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb)
}
/* read the next PES header. Return its position in ppos
(if not NULL), and its start code, pts and dts.
*
(if not NULL), and its start code, pts and dts.
*/
static
int
mpegps_read_pes_header
(
AVFormatContext
*
s
,
int64_t
*
ppos
,
int
*
pstart_code
,
...
...
@@ -207,20 +226,20 @@ static int mpegps_read_pes_header(AVFormatContext *s,
int
len
,
size
,
startcode
,
c
,
flags
,
header_len
;
int
pes_ext
,
ext2_len
,
id_ext
,
skip
;
int64_t
pts
,
dts
;
int64_t
last_sync
=
avio_tell
(
s
->
pb
);
error_redo:
avio_seek
(
s
->
pb
,
last_sync
,
SEEK_SET
);
redo:
/* next start code (should be immediately after) */
m
->
header_state
=
0xff
;
size
=
MAX_SYNC_SIZE
;
startcode
=
find_next_start_code
(
s
->
pb
,
&
size
,
&
m
->
header_state
);
last_sync
=
avio_tell
(
s
->
pb
);
if
(
startcode
<
0
){
if
(
s
->
pb
->
eof_reached
)
int64_t
last_sync
=
avio_tell
(
s
->
pb
);
error_redo:
avio_seek
(
s
->
pb
,
last_sync
,
SEEK_SET
);
redo:
/* next start code (should be immediately after) */
m
->
header_state
=
0xff
;
size
=
MAX_SYNC_SIZE
;
startcode
=
find_next_start_code
(
s
->
pb
,
&
size
,
&
m
->
header_state
);
last_sync
=
avio_tell
(
s
->
pb
);
if
(
startcode
<
0
)
{
if
(
s
->
pb
->
eof_reached
)
return
AVERROR_EOF
;
//FIXME we should remember header_state
//
FIXME we should remember header_state
return
AVERROR
(
EAGAIN
);
}
...
...
@@ -266,7 +285,7 @@ static int mpegps_read_pes_header(AVFormatContext *s,
pts
=
dts
=
AV_NOPTS_VALUE
;
/* stuffing */
for
(;;)
{
for
(;;)
{
if
(
len
<
1
)
goto
error_redo
;
c
=
avio_r8
(
s
->
pb
);
...
...
@@ -278,45 +297,47 @@ static int mpegps_read_pes_header(AVFormatContext *s,
if
((
c
&
0xc0
)
==
0x40
)
{
/* buffer scale & size */
avio_r8
(
s
->
pb
);
c
=
avio_r8
(
s
->
pb
);
c
=
avio_r8
(
s
->
pb
);
len
-=
2
;
}
if
((
c
&
0xe0
)
==
0x20
)
{
dts
=
pts
=
get_pts
(
s
->
pb
,
c
);
dts
=
pts
=
get_pts
(
s
->
pb
,
c
);
len
-=
4
;
if
(
c
&
0x10
){
dts
=
get_pts
(
s
->
pb
,
-
1
);
if
(
c
&
0x10
)
{
dts
=
get_pts
(
s
->
pb
,
-
1
);
len
-=
5
;
}
}
else
if
((
c
&
0xc0
)
==
0x80
)
{
/* mpeg 2 PES */
flags
=
avio_r8
(
s
->
pb
);
flags
=
avio_r8
(
s
->
pb
);
header_len
=
avio_r8
(
s
->
pb
);
len
-=
2
;
len
-=
2
;
if
(
header_len
>
len
)
goto
error_redo
;
len
-=
header_len
;
if
(
flags
&
0x80
)
{
dts
=
pts
=
get_pts
(
s
->
pb
,
-
1
);
dts
=
pts
=
get_pts
(
s
->
pb
,
-
1
);
header_len
-=
5
;
if
(
flags
&
0x40
)
{
dts
=
get_pts
(
s
->
pb
,
-
1
);
dts
=
get_pts
(
s
->
pb
,
-
1
);
header_len
-=
5
;
}
}
if
(
flags
&
0x3f
&&
header_len
==
0
){
if
(
flags
&
0x3f
&&
header_len
==
0
)
{
flags
&=
0xC0
;
av_log
(
s
,
AV_LOG_WARNING
,
"Further flags set but no bytes left
\n
"
);
}
if
(
flags
&
0x01
)
{
/* PES extension */
pes_ext
=
avio_r8
(
s
->
pb
);
header_len
--
;
/* Skip PES private data, program packet sequence counter and P-STD buffer */
skip
=
(
pes_ext
>>
4
)
&
0xb
;
/* Skip PES private data, program packet sequence counter
* and P-STD buffer */
skip
=
(
pes_ext
>>
4
)
&
0xb
;
skip
+=
skip
&
0x9
;
if
(
pes_ext
&
0x40
||
skip
>
header_len
){
if
(
pes_ext
&
0x40
||
skip
>
header_len
)
{
av_log
(
s
,
AV_LOG_WARNING
,
"pes_ext %X is invalid
\n
"
,
pes_ext
);
pes_ext
=
skip
=
0
;
pes_ext
=
skip
=
0
;
}
avio_skip
(
s
->
pb
,
skip
);
header_len
-=
skip
;
...
...
@@ -332,11 +353,10 @@ static int mpegps_read_pes_header(AVFormatContext *s,
}
}
}
if
(
header_len
<
0
)
if
(
header_len
<
0
)
goto
error_redo
;
avio_skip
(
s
->
pb
,
header_len
);
}
else
if
(
c
!=
0xf
)
}
else
if
(
c
!=
0xf
)
goto
redo
;
if
(
startcode
==
PRIVATE_STREAM_1
&&
!
m
->
psm_es_type
[
startcode
&
0xff
])
{
...
...
@@ -355,22 +375,23 @@ static int mpegps_read_pes_header(AVFormatContext *s,
}
}
}
if
(
len
<
0
)
if
(
len
<
0
)
goto
error_redo
;
if
(
dts
!=
AV_NOPTS_VALUE
&&
ppos
)
{
if
(
dts
!=
AV_NOPTS_VALUE
&&
ppos
)
{
int
i
;
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
if
(
startcode
==
s
->
streams
[
i
]
->
id
&&
s
->
pb
->
seekable
/* index useless on streams anyway */
)
{
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
if
(
startcode
==
s
->
streams
[
i
]
->
id
&&
s
->
pb
->
seekable
/* index useless on streams anyway */
)
{
ff_reduce_index
(
s
,
i
);
av_add_index_entry
(
s
->
streams
[
i
],
*
ppos
,
dts
,
0
,
0
,
AVINDEX_KEYFRAME
/* FIXME keyframe? */
);
av_add_index_entry
(
s
->
streams
[
i
],
*
ppos
,
dts
,
0
,
0
,
AVINDEX_KEYFRAME
/* FIXME keyframe? */
);
}
}
}
*
pstart_code
=
startcode
;
*
ppts
=
pts
;
*
pdts
=
dts
;
*
ppts
=
pts
;
*
pdts
=
dts
;
return
len
;
}
...
...
@@ -382,106 +403,111 @@ static int mpegps_read_packet(AVFormatContext *s,
int
len
,
startcode
,
i
,
es_type
,
ret
;
enum
AVCodecID
codec_id
=
AV_CODEC_ID_NONE
;
enum
AVMediaType
type
;
int64_t
pts
,
dts
,
dummy_pos
;
//dummy_pos is needed for the index building to work
int64_t
pts
,
dts
,
dummy_pos
;
//
dummy_pos is needed for the index building to work
uint8_t
av_uninit
(
dvdaudio_substream_type
);
redo:
redo:
len
=
mpegps_read_pes_header
(
s
,
&
dummy_pos
,
&
startcode
,
&
pts
,
&
dts
);
if
(
len
<
0
)
return
len
;
if
(
startcode
==
0x1bd
)
{
if
(
startcode
==
0x1bd
)
{
dvdaudio_substream_type
=
avio_r8
(
s
->
pb
);
avio_skip
(
s
->
pb
,
3
);
len
-=
4
;
}
/* now find stream */
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
st
=
s
->
streams
[
i
];
if
(
st
->
id
==
startcode
)
goto
found
;
}
es_type
=
m
->
psm_es_type
[
startcode
&
0xff
];
if
(
es_type
>
0
&&
es_type
!=
STREAM_TYPE_PRIVATE_DATA
)
{
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG1
)
{
if
(
es_type
>
0
&&
es_type
!=
STREAM_TYPE_PRIVATE_DATA
)
{
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG1
)
{
codec_id
=
AV_CODEC_ID_MPEG2VIDEO
;
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG2
)
{
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG2
)
{
codec_id
=
AV_CODEC_ID_MPEG2VIDEO
;
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_MPEG1
||
es_type
==
STREAM_TYPE_AUDIO_MPEG2
)
{
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_MPEG1
||
es_type
==
STREAM_TYPE_AUDIO_MPEG2
)
{
codec_id
=
AV_CODEC_ID_MP3
;
type
=
AVMEDIA_TYPE_AUDIO
;
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_AAC
)
{
type
=
AVMEDIA_TYPE_AUDIO
;
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_AAC
)
{
codec_id
=
AV_CODEC_ID_AAC
;
type
=
AVMEDIA_TYPE_AUDIO
;
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG4
)
{
type
=
AVMEDIA_TYPE_AUDIO
;
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG4
)
{
codec_id
=
AV_CODEC_ID_MPEG4
;
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_H264
)
{
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_H264
)
{
codec_id
=
AV_CODEC_ID_H264
;
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_AC3
)
{
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_AC3
)
{
codec_id
=
AV_CODEC_ID_AC3
;
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
}
else
{
goto
skip
;
}
}
else
if
(
startcode
>=
0x1e0
&&
startcode
<=
0x1ef
)
{
static
const
unsigned
char
avs_seqh
[
4
]
=
{
0
,
0
,
1
,
0xb0
};
unsigned
char
buf
[
8
];
avio_read
(
s
->
pb
,
buf
,
8
);
avio_seek
(
s
->
pb
,
-
8
,
SEEK_CUR
);
if
(
!
memcmp
(
buf
,
avs_seqh
,
4
)
&&
(
buf
[
6
]
!=
0
||
buf
[
7
]
!=
1
))
if
(
!
memcmp
(
buf
,
avs_seqh
,
4
)
&&
(
buf
[
6
]
!=
0
||
buf
[
7
]
!=
1
))
codec_id
=
AV_CODEC_ID_CAVS
;
else
codec_id
=
AV_CODEC_ID_PROBE
;
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
startcode
>=
0x1c0
&&
startcode
<=
0x1df
)
{
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
codec_id
=
m
->
sofdec
>
0
?
AV_CODEC_ID_ADPCM_ADX
:
AV_CODEC_ID_MP2
;
}
else
if
(
startcode
>=
0x80
&&
startcode
<=
0x87
)
{
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
codec_id
=
AV_CODEC_ID_AC3
;
}
else
if
(
(
startcode
>=
0x88
&&
startcode
<=
0x8f
)
||
(
startcode
>=
0x98
&&
startcode
<=
0x9f
))
{
}
else
if
(
(
startcode
>=
0x88
&&
startcode
<=
0x8f
)
||
(
startcode
>=
0x98
&&
startcode
<=
0x9f
))
{
/* 0x90 - 0x97 is reserved for SDDS in DVD specs */
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
codec_id
=
AV_CODEC_ID_DTS
;
}
else
if
(
startcode
>=
0xa0
&&
startcode
<=
0xaf
)
{
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
codec_id
=
AV_CODEC_ID_PCM_DVD
;
}
else
if
(
startcode
>=
0xb0
&&
startcode
<=
0xbf
)
{
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
codec_id
=
AV_CODEC_ID_TRUEHD
;
}
else
if
(
startcode
>=
0xc0
&&
startcode
<=
0xcf
)
{
/* Used for both AC-3 and E-AC-3 in EVOB files */
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
codec_id
=
AV_CODEC_ID_AC3
;
}
else
if
(
startcode
>=
0x20
&&
startcode
<=
0x3f
)
{
type
=
AVMEDIA_TYPE_SUBTITLE
;
type
=
AVMEDIA_TYPE_SUBTITLE
;
codec_id
=
AV_CODEC_ID_DVD_SUBTITLE
;
}
else
if
(
startcode
>=
0xfd55
&&
startcode
<=
0xfd5f
)
{
type
=
AVMEDIA_TYPE_VIDEO
;
type
=
AVMEDIA_TYPE_VIDEO
;
codec_id
=
AV_CODEC_ID_VC1
;
}
else
if
(
startcode
==
0x1bd
)
{
// check dvd audio substream type
type
=
AVMEDIA_TYPE_AUDIO
;
switch
(
dvdaudio_substream_type
&
0xe0
)
{
case
0xa0
:
codec_id
=
AV_CODEC_ID_PCM_DVD
;
break
;
case
0x80
:
if
((
dvdaudio_substream_type
&
0xf8
)
==
0x88
)
codec_id
=
AV_CODEC_ID_DTS
;
else
codec_id
=
AV_CODEC_ID_AC3
;
break
;
default:
av_log
(
s
,
AV_LOG_ERROR
,
"Unknown 0x1bd sub-stream
\n
"
);
goto
skip
;
switch
(
dvdaudio_substream_type
&
0xe0
)
{
case
0xa0
:
codec_id
=
AV_CODEC_ID_PCM_DVD
;
break
;
case
0x80
:
if
((
dvdaudio_substream_type
&
0xf8
)
==
0x88
)
codec_id
=
AV_CODEC_ID_DTS
;
else
codec_id
=
AV_CODEC_ID_AC3
;
break
;
default:
av_log
(
s
,
AV_LOG_ERROR
,
"Unknown 0x1bd sub-stream
\n
"
);
goto
skip
;
}
}
else
{
skip:
skip:
/* skip packet */
avio_skip
(
s
->
pb
,
len
);
goto
redo
;
...
...
@@ -490,17 +516,19 @@ static int mpegps_read_packet(AVFormatContext *s,
st
=
avformat_new_stream
(
s
,
NULL
);
if
(
!
st
)
goto
skip
;
st
->
id
=
startcode
;
st
->
id
=
startcode
;
st
->
codec
->
codec_type
=
type
;
st
->
codec
->
codec_id
=
codec_id
;
st
->
need_parsing
=
AVSTREAM_PARSE_FULL
;
found:
if
(
st
->
discard
>=
AVDISCARD_ALL
)
st
->
codec
->
codec_id
=
codec_id
;
st
->
need_parsing
=
AVSTREAM_PARSE_FULL
;
found:
if
(
st
->
discard
>=
AVDISCARD_ALL
)
goto
skip
;
ret
=
av_get_packet
(
s
->
pb
,
pkt
,
len
);
pkt
->
pts
=
pts
;
pkt
->
dts
=
dts
;
pkt
->
pos
=
dummy_pos
;
pkt
->
pts
=
pts
;
pkt
->
dts
=
dts
;
pkt
->
pos
=
dummy_pos
;
pkt
->
stream_index
=
st
->
index
;
av_dlog
(
s
,
"%d: pts=%0.3f dts=%0.3f size=%d
\n
"
,
pkt
->
stream_index
,
pkt
->
pts
/
90000
.
0
,
pkt
->
dts
/
90000
.
0
,
...
...
@@ -519,7 +547,7 @@ static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index,
if
(
avio_seek
(
s
->
pb
,
pos
,
SEEK_SET
)
<
0
)
return
AV_NOPTS_VALUE
;
for
(;;)
{
for
(;;)
{
len
=
mpegps_read_pes_header
(
s
,
&
pos
,
&
startcode
,
&
pts
,
&
dts
);
if
(
len
<
0
)
{
av_dlog
(
s
,
"none (ret=%d)
\n
"
,
len
);
...
...
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