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 @@
#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