Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
10
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
BC
public
external
ffmpeg
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
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
169 additions
and
141 deletions
+169
-141
libavformat/mpeg.c
libavformat/mpeg.c
+169
-141
No files found.
libavformat/mpeg.c
View file @
5b8f0a5e
...
@@ -31,72 +31,89 @@
...
@@ -31,72 +31,89 @@
#define MAX_SYNC_SIZE 100000
#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
pes1
;
int
pes2
=
(
p
[
3
]
&
0xC0
)
==
0x80
int
pes2
=
(
p
[
3
]
&
0xC0
)
==
0x80
&&
&&
(
p
[
4
]
&
0xC0
)
!=
0x40
(
p
[
4
]
&
0xC0
)
!=
0x40
&&
&&
((
p
[
4
]
&
0xC0
)
==
0x00
||
(
p
[
4
]
&
0xC0
)
>>
2
==
(
p
[
6
]
&
0xF0
));
((
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
;
for
(
p
+=
3
;
p
<
end
&&
*
p
==
0xFF
;
p
++
)
;
if
((
*
p
&
0xF0
)
==
0x20
){
if
((
*
p
&
0xC0
)
==
0x40
)
pes1
=
p
[
0
]
&
p
[
2
]
&
p
[
4
]
&
1
;
p
+=
2
;
}
else
if
((
*
p
&
0xF0
)
==
0x30
){
pes1
=
p
[
0
]
&
p
[
2
]
&
p
[
4
]
&
p
[
5
]
&
p
[
7
]
&
p
[
9
]
&
1
;
if
((
*
p
&
0xF0
)
==
0x20
)
}
else
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
;
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
;
return
(
buf
[
1
]
&
0xC0
)
==
0x40
||
(
buf
[
1
]
&
0xF0
)
==
0x20
;
}
}
static
int
mpegps_probe
(
AVProbeData
*
p
)
static
int
mpegps_probe
(
AVProbeData
*
p
)
{
{
uint32_t
code
=
-
1
;
uint32_t
code
=
-
1
;
int
sys
=
0
,
pspack
=
0
,
priv1
=
0
,
vid
=
0
,
audio
=
0
,
invalid
=
0
;
int
i
;
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
++
){
for
(
i
=
0
;
i
<
p
->
buf_size
;
i
++
)
{
code
=
(
code
<<
8
)
+
p
->
buf
[
i
];
code
=
(
code
<<
8
)
+
p
->
buf
[
i
];
if
((
code
&
0xffffff00
)
==
0x100
)
{
if
((
code
&
0xffffff00
)
==
0x100
)
{
int
len
=
p
->
buf
[
i
+
1
]
<<
8
|
p
->
buf
[
i
+
2
];
int
len
=
p
->
buf
[
i
+
1
]
<<
8
|
p
->
buf
[
i
+
2
];
int
pes
=
check_pes
(
p
->
buf
+
i
,
p
->
buf
+
p
->
buf_size
);
int
pes
=
check_pes
(
p
->
buf
+
i
,
p
->
buf
+
p
->
buf_size
);
int
pack
=
check_pack_header
(
p
->
buf
+
i
);
int
pack
=
check_pack_header
(
p
->
buf
+
i
);
if
(
code
==
SYSTEM_HEADER_START_CODE
)
sys
++
;
if
(
code
==
SYSTEM_HEADER_START_CODE
)
else
if
(
code
==
PACK_START_CODE
&&
pack
)
pspack
++
;
sys
++
;
else
if
((
code
&
0xf0
)
==
VIDEO_ID
&&
pes
)
vid
++
;
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
// skip pes payload to avoid start code emulation for private
// and audio streams
// and audio streams
else
if
((
code
&
0xe0
)
==
AUDIO_ID
&&
pes
)
{
audio
++
;
i
+=
len
;}
else
if
((
code
&
0xe0
)
==
AUDIO_ID
&&
pes
)
{
else
if
(
code
==
PRIVATE_STREAM_1
&&
pes
)
{
priv1
++
;
i
+=
len
;}
audio
++
;
i
+=
len
;
else
if
((
code
&
0xf0
)
==
VIDEO_ID
&&
!
pes
)
invalid
++
;
}
else
if
(
code
==
PRIVATE_STREAM_1
&&
pes
)
{
else
if
((
code
&
0xe0
)
==
AUDIO_ID
&&
!
pes
)
invalid
++
;
priv1
++
;
else
if
(
code
==
PRIVATE_STREAM_1
&&
!
pes
)
invalid
++
;
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
;
score
=
AVPROBE_SCORE_EXTENSION
/
2
;
if
(
sys
>
invalid
&&
sys
*
9
<=
pspack
*
10
)
if
(
sys
>
invalid
&&
sys
*
9
<=
pspack
*
10
)
return
pspack
>
2
?
AVPROBE_SCORE_EXTENSION
+
2
:
AVPROBE_SCORE_EXTENSION
/
2
;
// 1 more than .mpg
return
pspack
>
2
?
AVPROBE_SCORE_EXTENSION
+
2
if
(
pspack
>
invalid
&&
(
priv1
+
vid
+
audio
)
*
10
>=
pspack
*
9
)
:
AVPROBE_SCORE_EXTENSION
/
2
;
// 1 more than .mpg
return
pspack
>
2
?
AVPROBE_SCORE_EXTENSION
+
2
:
AVPROBE_SCORE_EXTENSION
/
2
;
// 1 more than .mpg
if
(
pspack
>
invalid
&&
(
priv1
+
vid
+
audio
)
*
10
>=
pspack
*
9
)
if
((
!!
vid
^
!!
audio
)
&&
(
audio
>
4
||
vid
>
1
)
&&
!
sys
&&
!
pspack
&&
p
->
buf_size
>
2048
&&
vid
+
audio
>
invalid
)
/* PES stream */
return
pspack
>
2
?
AVPROBE_SCORE_EXTENSION
+
2
return
(
audio
>
12
||
vid
>
3
)
?
AVPROBE_SCORE_EXTENSION
+
2
:
AVPROBE_SCORE_EXTENSION
/
2
;
:
AVPROBE_SCORE_EXTENSION
/
2
;
// 1 more than .mpg
if
((
!!
vid
^
!!
audio
)
&&
(
audio
>
4
||
vid
>
1
)
&&
!
sys
&&
//02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
!
pspack
&&
p
->
buf_size
>
2048
&&
vid
+
audio
>
invalid
)
/* PES stream */
//mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
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
;
return
score
;
}
}
typedef
struct
MpegDemuxContext
{
typedef
struct
MpegDemuxContext
{
int32_t
header_state
;
int32_t
header_state
;
unsigned
char
psm_es_type
[
256
];
unsigned
char
psm_es_type
[
256
];
...
@@ -106,11 +123,11 @@ typedef struct MpegDemuxContext {
...
@@ -106,11 +123,11 @@ typedef struct MpegDemuxContext {
static
int
mpegps_read_header
(
AVFormatContext
*
s
)
static
int
mpegps_read_header
(
AVFormatContext
*
s
)
{
{
MpegDemuxContext
*
m
=
s
->
priv_data
;
MpegDemuxContext
*
m
=
s
->
priv_data
;
const
char
*
sofdec
=
"Sofdec"
;
const
char
*
sofdec
=
"Sofdec"
;
int
v
,
i
=
0
;
int
v
,
i
=
0
;
m
->
header_state
=
0xff
;
m
->
header_state
=
0xff
;
s
->
ctx_flags
|=
AVFMTCTX_NOHEADER
;
s
->
ctx_flags
|=
AVFMTCTX_NOHEADER
;
m
->
sofdec
=
-
1
;
m
->
sofdec
=
-
1
;
do
{
do
{
...
@@ -129,8 +146,8 @@ static int64_t get_pts(AVIOContext *pb, int c)
...
@@ -129,8 +146,8 @@ static int64_t get_pts(AVIOContext *pb, int c)
{
{
uint8_t
buf
[
5
];
uint8_t
buf
[
5
];
buf
[
0
]
=
c
<
0
?
avio_r8
(
pb
)
:
c
;
buf
[
0
]
=
c
<
0
?
avio_r8
(
pb
)
:
c
;
avio_read
(
pb
,
buf
+
1
,
4
);
avio_read
(
pb
,
buf
+
1
,
4
);
return
ff_parse_pes_pts
(
buf
);
return
ff_parse_pes_pts
(
buf
);
}
}
...
@@ -142,7 +159,7 @@ static int find_next_start_code(AVIOContext *pb, int *size_ptr,
...
@@ -142,7 +159,7 @@ static int find_next_start_code(AVIOContext *pb, int *size_ptr,
int
val
,
n
;
int
val
,
n
;
state
=
*
header_state
;
state
=
*
header_state
;
n
=
*
size_ptr
;
n
=
*
size_ptr
;
while
(
n
>
0
)
{
while
(
n
>
0
)
{
if
(
pb
->
eof_reached
)
if
(
pb
->
eof_reached
)
break
;
break
;
...
@@ -150,15 +167,16 @@ static int find_next_start_code(AVIOContext *pb, int *size_ptr,
...
@@ -150,15 +167,16 @@ static int find_next_start_code(AVIOContext *pb, int *size_ptr,
n
--
;
n
--
;
if
(
state
==
0x000001
)
{
if
(
state
==
0x000001
)
{
state
=
((
state
<<
8
)
|
v
)
&
0xffffff
;
state
=
((
state
<<
8
)
|
v
)
&
0xffffff
;
val
=
state
;
val
=
state
;
goto
found
;
goto
found
;
}
}
state
=
((
state
<<
8
)
|
v
)
&
0xffffff
;
state
=
((
state
<<
8
)
|
v
)
&
0xffffff
;
}
}
val
=
-
1
;
val
=
-
1
;
found:
found:
*
header_state
=
state
;
*
header_state
=
state
;
*
size_ptr
=
n
;
*
size_ptr
=
n
;
return
val
;
return
val
;
}
}
...
@@ -182,10 +200,11 @@ static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb)
...
@@ -182,10 +200,11 @@ static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb)
es_map_length
=
avio_rb16
(
pb
);
es_map_length
=
avio_rb16
(
pb
);
/* at least one es available? */
/* at least one es available? */
while
(
es_map_length
>=
4
){
while
(
es_map_length
>=
4
)
{
unsigned
char
type
=
avio_r8
(
pb
);
unsigned
char
type
=
avio_r8
(
pb
);
unsigned
char
es_id
=
avio_r8
(
pb
);
unsigned
char
es_id
=
avio_r8
(
pb
);
uint16_t
es_info_length
=
avio_rb16
(
pb
);
uint16_t
es_info_length
=
avio_rb16
(
pb
);
/* remember mapping from stream id to stream type */
/* remember mapping from stream id to stream type */
m
->
psm_es_type
[
es_id
]
=
type
;
m
->
psm_es_type
[
es_id
]
=
type
;
/* skip program_stream_info */
/* skip program_stream_info */
...
@@ -197,7 +216,7 @@ static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb)
...
@@ -197,7 +216,7 @@ static long mpegps_psm_parse(MpegDemuxContext *m, AVIOContext *pb)
}
}
/* read the next PES header. Return its position in ppos
/* 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
,
static
int
mpegps_read_pes_header
(
AVFormatContext
*
s
,
int64_t
*
ppos
,
int
*
pstart_code
,
int64_t
*
ppos
,
int
*
pstart_code
,
...
@@ -207,20 +226,20 @@ static int mpegps_read_pes_header(AVFormatContext *s,
...
@@ -207,20 +226,20 @@ static int mpegps_read_pes_header(AVFormatContext *s,
int
len
,
size
,
startcode
,
c
,
flags
,
header_len
;
int
len
,
size
,
startcode
,
c
,
flags
,
header_len
;
int
pes_ext
,
ext2_len
,
id_ext
,
skip
;
int
pes_ext
,
ext2_len
,
id_ext
,
skip
;
int64_t
pts
,
dts
;
int64_t
pts
,
dts
;
int64_t
last_sync
=
avio_tell
(
s
->
pb
);
int64_t
last_sync
=
avio_tell
(
s
->
pb
);
error_redo:
error_redo:
avio_seek
(
s
->
pb
,
last_sync
,
SEEK_SET
);
avio_seek
(
s
->
pb
,
last_sync
,
SEEK_SET
);
redo:
redo:
/* next start code (should be immediately after) */
/* next start code (should be immediately after) */
m
->
header_state
=
0xff
;
m
->
header_state
=
0xff
;
size
=
MAX_SYNC_SIZE
;
size
=
MAX_SYNC_SIZE
;
startcode
=
find_next_start_code
(
s
->
pb
,
&
size
,
&
m
->
header_state
);
startcode
=
find_next_start_code
(
s
->
pb
,
&
size
,
&
m
->
header_state
);
last_sync
=
avio_tell
(
s
->
pb
);
last_sync
=
avio_tell
(
s
->
pb
);
if
(
startcode
<
0
){
if
(
startcode
<
0
)
{
if
(
s
->
pb
->
eof_reached
)
if
(
s
->
pb
->
eof_reached
)
return
AVERROR_EOF
;
return
AVERROR_EOF
;
//FIXME we should remember header_state
//
FIXME we should remember header_state
return
AVERROR
(
EAGAIN
);
return
AVERROR
(
EAGAIN
);
}
}
...
@@ -266,7 +285,7 @@ static int mpegps_read_pes_header(AVFormatContext *s,
...
@@ -266,7 +285,7 @@ static int mpegps_read_pes_header(AVFormatContext *s,
pts
=
pts
=
dts
=
AV_NOPTS_VALUE
;
dts
=
AV_NOPTS_VALUE
;
/* stuffing */
/* stuffing */
for
(;;)
{
for
(;;)
{
if
(
len
<
1
)
if
(
len
<
1
)
goto
error_redo
;
goto
error_redo
;
c
=
avio_r8
(
s
->
pb
);
c
=
avio_r8
(
s
->
pb
);
...
@@ -278,45 +297,47 @@ static int mpegps_read_pes_header(AVFormatContext *s,
...
@@ -278,45 +297,47 @@ static int mpegps_read_pes_header(AVFormatContext *s,
if
((
c
&
0xc0
)
==
0x40
)
{
if
((
c
&
0xc0
)
==
0x40
)
{
/* buffer scale & size */
/* buffer scale & size */
avio_r8
(
s
->
pb
);
avio_r8
(
s
->
pb
);
c
=
avio_r8
(
s
->
pb
);
c
=
avio_r8
(
s
->
pb
);
len
-=
2
;
len
-=
2
;
}
}
if
((
c
&
0xe0
)
==
0x20
)
{
if
((
c
&
0xe0
)
==
0x20
)
{
dts
=
pts
=
get_pts
(
s
->
pb
,
c
);
dts
=
pts
=
get_pts
(
s
->
pb
,
c
);
len
-=
4
;
len
-=
4
;
if
(
c
&
0x10
){
if
(
c
&
0x10
)
{
dts
=
get_pts
(
s
->
pb
,
-
1
);
dts
=
get_pts
(
s
->
pb
,
-
1
);
len
-=
5
;
len
-=
5
;
}
}
}
else
if
((
c
&
0xc0
)
==
0x80
)
{
}
else
if
((
c
&
0xc0
)
==
0x80
)
{
/* mpeg 2 PES */
/* mpeg 2 PES */
flags
=
avio_r8
(
s
->
pb
);
flags
=
avio_r8
(
s
->
pb
);
header_len
=
avio_r8
(
s
->
pb
);
header_len
=
avio_r8
(
s
->
pb
);
len
-=
2
;
len
-=
2
;
if
(
header_len
>
len
)
if
(
header_len
>
len
)
goto
error_redo
;
goto
error_redo
;
len
-=
header_len
;
len
-=
header_len
;
if
(
flags
&
0x80
)
{
if
(
flags
&
0x80
)
{
dts
=
pts
=
get_pts
(
s
->
pb
,
-
1
);
dts
=
pts
=
get_pts
(
s
->
pb
,
-
1
);
header_len
-=
5
;
header_len
-=
5
;
if
(
flags
&
0x40
)
{
if
(
flags
&
0x40
)
{
dts
=
get_pts
(
s
->
pb
,
-
1
);
dts
=
get_pts
(
s
->
pb
,
-
1
);
header_len
-=
5
;
header_len
-=
5
;
}
}
}
}
if
(
flags
&
0x3f
&&
header_len
==
0
){
if
(
flags
&
0x3f
&&
header_len
==
0
)
{
flags
&=
0xC0
;
flags
&=
0xC0
;
av_log
(
s
,
AV_LOG_WARNING
,
"Further flags set but no bytes left
\n
"
);
av_log
(
s
,
AV_LOG_WARNING
,
"Further flags set but no bytes left
\n
"
);
}
}
if
(
flags
&
0x01
)
{
/* PES extension */
if
(
flags
&
0x01
)
{
/* PES extension */
pes_ext
=
avio_r8
(
s
->
pb
);
pes_ext
=
avio_r8
(
s
->
pb
);
header_len
--
;
header_len
--
;
/* Skip PES private data, program packet sequence counter and P-STD buffer */
/* Skip PES private data, program packet sequence counter
skip
=
(
pes_ext
>>
4
)
&
0xb
;
* and P-STD buffer */
skip
=
(
pes_ext
>>
4
)
&
0xb
;
skip
+=
skip
&
0x9
;
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
);
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
);
avio_skip
(
s
->
pb
,
skip
);
header_len
-=
skip
;
header_len
-=
skip
;
...
@@ -332,11 +353,10 @@ static int mpegps_read_pes_header(AVFormatContext *s,
...
@@ -332,11 +353,10 @@ static int mpegps_read_pes_header(AVFormatContext *s,
}
}
}
}
}
}
if
(
header_len
<
0
)
if
(
header_len
<
0
)
goto
error_redo
;
goto
error_redo
;
avio_skip
(
s
->
pb
,
header_len
);
avio_skip
(
s
->
pb
,
header_len
);
}
}
else
if
(
c
!=
0xf
)
else
if
(
c
!=
0xf
)
goto
redo
;
goto
redo
;
if
(
startcode
==
PRIVATE_STREAM_1
&&
!
m
->
psm_es_type
[
startcode
&
0xff
])
{
if
(
startcode
==
PRIVATE_STREAM_1
&&
!
m
->
psm_es_type
[
startcode
&
0xff
])
{
...
@@ -355,22 +375,23 @@ static int mpegps_read_pes_header(AVFormatContext *s,
...
@@ -355,22 +375,23 @@ static int mpegps_read_pes_header(AVFormatContext *s,
}
}
}
}
}
}
if
(
len
<
0
)
if
(
len
<
0
)
goto
error_redo
;
goto
error_redo
;
if
(
dts
!=
AV_NOPTS_VALUE
&&
ppos
){
if
(
dts
!=
AV_NOPTS_VALUE
&&
ppos
)
{
int
i
;
int
i
;
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
){
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
if
(
startcode
==
s
->
streams
[
i
]
->
id
&&
if
(
startcode
==
s
->
streams
[
i
]
->
id
&&
s
->
pb
->
seekable
/* index useless on streams anyway */
)
{
s
->
pb
->
seekable
/* index useless on streams anyway */
)
{
ff_reduce_index
(
s
,
i
);
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
;
*
pstart_code
=
startcode
;
*
ppts
=
pts
;
*
ppts
=
pts
;
*
pdts
=
dts
;
*
pdts
=
dts
;
return
len
;
return
len
;
}
}
...
@@ -382,106 +403,111 @@ static int mpegps_read_packet(AVFormatContext *s,
...
@@ -382,106 +403,111 @@ static int mpegps_read_packet(AVFormatContext *s,
int
len
,
startcode
,
i
,
es_type
,
ret
;
int
len
,
startcode
,
i
,
es_type
,
ret
;
enum
AVCodecID
codec_id
=
AV_CODEC_ID_NONE
;
enum
AVCodecID
codec_id
=
AV_CODEC_ID_NONE
;
enum
AVMediaType
type
;
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
);
uint8_t
av_uninit
(
dvdaudio_substream_type
);
redo:
redo:
len
=
mpegps_read_pes_header
(
s
,
&
dummy_pos
,
&
startcode
,
&
pts
,
&
dts
);
len
=
mpegps_read_pes_header
(
s
,
&
dummy_pos
,
&
startcode
,
&
pts
,
&
dts
);
if
(
len
<
0
)
if
(
len
<
0
)
return
len
;
return
len
;
if
(
startcode
==
0x1bd
)
{
if
(
startcode
==
0x1bd
)
{
dvdaudio_substream_type
=
avio_r8
(
s
->
pb
);
dvdaudio_substream_type
=
avio_r8
(
s
->
pb
);
avio_skip
(
s
->
pb
,
3
);
avio_skip
(
s
->
pb
,
3
);
len
-=
4
;
len
-=
4
;
}
}
/* now find stream */
/* now find stream */
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
nb_streams
;
i
++
)
{
st
=
s
->
streams
[
i
];
st
=
s
->
streams
[
i
];
if
(
st
->
id
==
startcode
)
if
(
st
->
id
==
startcode
)
goto
found
;
goto
found
;
}
}
es_type
=
m
->
psm_es_type
[
startcode
&
0xff
];
es_type
=
m
->
psm_es_type
[
startcode
&
0xff
];
if
(
es_type
>
0
&&
es_type
!=
STREAM_TYPE_PRIVATE_DATA
){
if
(
es_type
>
0
&&
es_type
!=
STREAM_TYPE_PRIVATE_DATA
)
{
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG1
){
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG1
)
{
codec_id
=
AV_CODEC_ID_MPEG2VIDEO
;
codec_id
=
AV_CODEC_ID_MPEG2VIDEO
;
type
=
AVMEDIA_TYPE_VIDEO
;
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG2
){
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG2
)
{
codec_id
=
AV_CODEC_ID_MPEG2VIDEO
;
codec_id
=
AV_CODEC_ID_MPEG2VIDEO
;
type
=
AVMEDIA_TYPE_VIDEO
;
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_MPEG1
||
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_MPEG1
||
es_type
==
STREAM_TYPE_AUDIO_MPEG2
){
es_type
==
STREAM_TYPE_AUDIO_MPEG2
)
{
codec_id
=
AV_CODEC_ID_MP3
;
codec_id
=
AV_CODEC_ID_MP3
;
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_AAC
){
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_AAC
)
{
codec_id
=
AV_CODEC_ID_AAC
;
codec_id
=
AV_CODEC_ID_AAC
;
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG4
){
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_MPEG4
)
{
codec_id
=
AV_CODEC_ID_MPEG4
;
codec_id
=
AV_CODEC_ID_MPEG4
;
type
=
AVMEDIA_TYPE_VIDEO
;
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_H264
){
}
else
if
(
es_type
==
STREAM_TYPE_VIDEO_H264
)
{
codec_id
=
AV_CODEC_ID_H264
;
codec_id
=
AV_CODEC_ID_H264
;
type
=
AVMEDIA_TYPE_VIDEO
;
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_AC3
){
}
else
if
(
es_type
==
STREAM_TYPE_AUDIO_AC3
)
{
codec_id
=
AV_CODEC_ID_AC3
;
codec_id
=
AV_CODEC_ID_AC3
;
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
}
else
{
}
else
{
goto
skip
;
goto
skip
;
}
}
}
else
if
(
startcode
>=
0x1e0
&&
startcode
<=
0x1ef
)
{
}
else
if
(
startcode
>=
0x1e0
&&
startcode
<=
0x1ef
)
{
static
const
unsigned
char
avs_seqh
[
4
]
=
{
0
,
0
,
1
,
0xb0
};
static
const
unsigned
char
avs_seqh
[
4
]
=
{
0
,
0
,
1
,
0xb0
};
unsigned
char
buf
[
8
];
unsigned
char
buf
[
8
];
avio_read
(
s
->
pb
,
buf
,
8
);
avio_read
(
s
->
pb
,
buf
,
8
);
avio_seek
(
s
->
pb
,
-
8
,
SEEK_CUR
);
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
;
codec_id
=
AV_CODEC_ID_CAVS
;
else
else
codec_id
=
AV_CODEC_ID_PROBE
;
codec_id
=
AV_CODEC_ID_PROBE
;
type
=
AVMEDIA_TYPE_VIDEO
;
type
=
AVMEDIA_TYPE_VIDEO
;
}
else
if
(
startcode
>=
0x1c0
&&
startcode
<=
0x1df
)
{
}
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
;
codec_id
=
m
->
sofdec
>
0
?
AV_CODEC_ID_ADPCM_ADX
:
AV_CODEC_ID_MP2
;
}
else
if
(
startcode
>=
0x80
&&
startcode
<=
0x87
)
{
}
else
if
(
startcode
>=
0x80
&&
startcode
<=
0x87
)
{
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
codec_id
=
AV_CODEC_ID_AC3
;
codec_id
=
AV_CODEC_ID_AC3
;
}
else
if
(
(
startcode
>=
0x88
&&
startcode
<=
0x8f
)
}
else
if
(
(
startcode
>=
0x88
&&
startcode
<=
0x8f
)
||
||
(
startcode
>=
0x98
&&
startcode
<=
0x9f
))
{
(
startcode
>=
0x98
&&
startcode
<=
0x9f
))
{
/* 0x90 - 0x97 is reserved for SDDS in DVD specs */
/* 0x90 - 0x97 is reserved for SDDS in DVD specs */
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
codec_id
=
AV_CODEC_ID_DTS
;
codec_id
=
AV_CODEC_ID_DTS
;
}
else
if
(
startcode
>=
0xa0
&&
startcode
<=
0xaf
)
{
}
else
if
(
startcode
>=
0xa0
&&
startcode
<=
0xaf
)
{
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
codec_id
=
AV_CODEC_ID_PCM_DVD
;
codec_id
=
AV_CODEC_ID_PCM_DVD
;
}
else
if
(
startcode
>=
0xb0
&&
startcode
<=
0xbf
)
{
}
else
if
(
startcode
>=
0xb0
&&
startcode
<=
0xbf
)
{
type
=
AVMEDIA_TYPE_AUDIO
;
type
=
AVMEDIA_TYPE_AUDIO
;
codec_id
=
AV_CODEC_ID_TRUEHD
;
codec_id
=
AV_CODEC_ID_TRUEHD
;
}
else
if
(
startcode
>=
0xc0
&&
startcode
<=
0xcf
)
{
}
else
if
(
startcode
>=
0xc0
&&
startcode
<=
0xcf
)
{
/* Used for both AC-3 and E-AC-3 in EVOB files */
/* 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
;
codec_id
=
AV_CODEC_ID_AC3
;
}
else
if
(
startcode
>=
0x20
&&
startcode
<=
0x3f
)
{
}