FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavformat
supdec.c
Go to the documentation of this file.
1
/*
2
* This file is part of FFmpeg.
3
*
4
* FFmpeg is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU Lesser General Public
6
* License as published by the Free Software Foundation; either
7
* version 2.1 of the License, or (at your option) any later version.
8
*
9
* FFmpeg is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12
* Lesser General Public License for more details.
13
*
14
* You should have received a copy of the GNU Lesser General Public
15
* License along with FFmpeg; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
*/
18
19
#include "
avformat.h
"
20
#include "
internal.h
"
21
#include "
libavutil/intreadwrite.h
"
22
23
#define SUP_PGS_MAGIC 0x5047
/* "PG", big endian */
24
25
static
int
sup_read_header
(
AVFormatContext
*
s
)
26
{
27
AVStream
*st =
avformat_new_stream
(s,
NULL
);
28
if
(!st)
29
return
AVERROR
(ENOMEM);
30
st->
codec
->
codec_type
=
AVMEDIA_TYPE_SUBTITLE
;
31
st->
codec
->
codec_id
=
AV_CODEC_ID_HDMV_PGS_SUBTITLE
;
32
avpriv_set_pts_info
(st, 32, 1, 90000);
33
34
return
0;
35
}
36
37
static
int
sup_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
38
{
39
int64_t
pts
, dts, pos;
40
int
ret
;
41
42
pos =
avio_tell
(s->
pb
);
43
44
if
(
avio_rb16
(s->
pb
) !=
SUP_PGS_MAGIC
)
45
return
avio_feof
(s->
pb
) ?
AVERROR_EOF
:
AVERROR_INVALIDDATA
;
46
47
pts =
avio_rb32
(s->
pb
);
48
dts =
avio_rb32
(s->
pb
);
49
50
if
((ret =
av_get_packet
(s->
pb
, pkt, 3)) < 0)
51
return
ret
;
52
53
pkt->
stream_index
= 0;
54
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
55
pkt->
pos
= pos;
56
pkt->
pts
=
pts
;
57
// Many files have DTS set to 0 for all packets, so assume 0 means unset.
58
pkt->
dts
= dts ? dts :
AV_NOPTS_VALUE
;
59
60
if
(pkt->
size
>= 3) {
61
// The full packet size is stored as part of the packet.
62
size_t
len
=
AV_RB16
(pkt->
data
+ 1);
63
64
if
((ret =
av_append_packet
(s->
pb
, pkt, len)) < 0)
65
return
ret
;
66
}
67
68
return
0;
69
}
70
71
static
int
sup_probe
(
AVProbeData
*p)
72
{
73
unsigned
char
*
buf
= p->
buf
;
74
size_t
buf_size = p->
buf_size
;
75
int
nb_packets;
76
77
for
(nb_packets = 0; nb_packets < 10; nb_packets++) {
78
size_t
full_packet_size;
79
if
(buf_size < 10 + 3)
80
break
;
81
if
(
AV_RB16
(buf) !=
SUP_PGS_MAGIC
)
82
return
0;
83
full_packet_size =
AV_RB16
(buf + 10 + 1) + 10 + 3;
84
if
(buf_size < full_packet_size)
85
break
;
86
buf += full_packet_size;
87
buf_size -= full_packet_size;
88
}
89
if
(!nb_packets)
90
return
0;
91
if
(nb_packets < 2)
92
return
AVPROBE_SCORE_RETRY
/ 2;
93
if
(nb_packets < 4)
94
return
AVPROBE_SCORE_RETRY
;
95
if
(nb_packets < 10)
96
return
AVPROBE_SCORE_EXTENSION
;
97
return
AVPROBE_SCORE_MAX
;
98
}
99
100
AVInputFormat
ff_sup_demuxer
= {
101
.
name
=
"sup"
,
102
.long_name =
NULL_IF_CONFIG_SMALL
(
"raw HDMV Presentation Graphic Stream subtitles"
),
103
.extensions =
"sup"
,
104
.mime_type =
"application/x-pgs"
,
105
.read_probe =
sup_probe
,
106
.read_header =
sup_read_header
,
107
.read_packet =
sup_read_packet
,
108
.flags =
AVFMT_GENERIC_INDEX
,
109
};
Generated on Sun Mar 8 2015 02:35:12 for FFmpeg by
1.8.2