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
stldec.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2014 Eejya Singh
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
/**
22
* @file
23
* STL subtitles format demuxer
24
* @see https://documentation.apple.com/en/dvdstudiopro/usermanual/index.html#chapter=19%26section=13%26tasks=true
25
*/
26
27
#include "
avformat.h
"
28
#include "
internal.h
"
29
#include "
subtitles.h
"
30
#include "
libavutil/intreadwrite.h
"
31
#include "
libavutil/avstring.h
"
32
33
typedef
struct
{
34
FFDemuxSubtitlesQueue
q
;
35
}
STLContext
;
36
37
static
int
stl_probe
(
AVProbeData
*p)
38
{
39
char
c
;
40
const
unsigned
char
*ptr = p->
buf
;
41
42
if
(
AV_RB24
(ptr) == 0xEFBBBF)
43
ptr += 3;
/* skip UTF-8 BOM */
44
45
while
(*ptr ==
'\r'
|| *ptr ==
'\n'
|| *ptr ==
'$'
|| !strncmp(ptr,
"//"
, 2))
46
ptr +=
ff_subtitles_next_line
(ptr);
47
48
if
(sscanf(ptr,
"%*d:%*d:%*d:%*d , %*d:%*d:%*d:%*d , %c"
, &c) == 1)
49
return
AVPROBE_SCORE_MAX
;
50
51
return
0;
52
}
53
54
static
int64_t
get_pts
(
char
**
buf
,
int
*
duration
)
55
{
56
int
hh1, mm1, ss1, ms1;
57
int
hh2, mm2, ss2, ms2;
58
int
len
= 0;
59
60
if
(sscanf(*buf,
"%2d:%2d:%2d:%2d , %2d:%2d:%2d:%2d , %n"
,
61
&hh1, &mm1, &ss1, &ms1,
62
&hh2, &mm2, &ss2, &ms2, &len) >= 8 && len > 0) {
63
int64_t
start
= (hh1*3600LL + mm1*60LL + ss1) * 100LL + ms1;
64
int64_t
end
= (hh2*3600LL + mm2*60LL + ss2) * 100LL + ms2;
65
*duration = end -
start
;
66
*buf +=
len
;
67
return
start
;
68
}
69
return
AV_NOPTS_VALUE
;
70
}
71
72
static
int
stl_read_header
(
AVFormatContext
*
s
)
73
{
74
STLContext
*
stl
= s->
priv_data
;
75
AVStream
*st =
avformat_new_stream
(s, NULL);
76
77
if
(!st)
78
return
AVERROR
(ENOMEM);
79
avpriv_set_pts_info
(st, 64, 1, 100);
80
st->
codec
->
codec_type
=
AVMEDIA_TYPE_SUBTITLE
;
81
st->
codec
->
codec_id
=
AV_CODEC_ID_STL
;
82
83
while
(!
avio_feof
(s->
pb
)) {
84
char
line
[4096];
85
char
*p = line;
86
const
int64_t pos =
avio_tell
(s->
pb
);
87
int
len
=
ff_get_line
(s->
pb
, line,
sizeof
(line));
88
int64_t pts_start;
89
int
duration
;
90
91
if
(!len)
92
break
;
93
94
line[strcspn(line,
"\r\n"
)] = 0;
95
pts_start =
get_pts
(&p , &duration);
96
97
if
(pts_start !=
AV_NOPTS_VALUE
) {
98
AVPacket
*sub;
99
sub =
ff_subtitles_queue_insert
(&stl->
q
, p, strlen(p), 0);
100
if
(!sub)
101
return
AVERROR
(ENOMEM);
102
sub->
pos
= pos;
103
sub->
pts
= pts_start;
104
sub->
duration
=
duration
;
105
}
106
}
107
ff_subtitles_queue_finalize
(&stl->
q
);
108
return
0;
109
}
110
static
int
stl_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
111
{
112
STLContext
*
stl
= s->
priv_data
;
113
return
ff_subtitles_queue_read_packet
(&stl->
q
, pkt);
114
}
115
116
static
int
stl_read_seek
(
AVFormatContext
*
s
,
int
stream_index,
117
int64_t min_ts, int64_t ts, int64_t max_ts,
int
flags
)
118
{
119
STLContext
*
stl
= s->
priv_data
;
120
return
ff_subtitles_queue_seek
(&stl->
q
, s, stream_index,
121
min_ts, ts, max_ts, flags);
122
}
123
124
static
int
stl_read_close
(
AVFormatContext
*
s
)
125
{
126
STLContext
*
stl
= s->
priv_data
;
127
ff_subtitles_queue_clean
(&stl->
q
);
128
return
0;
129
}
130
131
AVInputFormat
ff_stl_demuxer
= {
132
.
name
=
"stl"
,
133
.long_name =
NULL_IF_CONFIG_SMALL
(
"Spruce subtitle format"
),
134
.priv_data_size =
sizeof
(
STLContext
),
135
.
read_probe
=
stl_probe
,
136
.
read_header
=
stl_read_header
,
137
.
read_packet
=
stl_read_packet
,
138
.read_seek2 =
stl_read_seek
,
139
.
read_close
=
stl_read_close
,
140
.extensions =
"stl"
,
141
};
Generated on Fri Dec 5 2014 04:42:14 for FFmpeg by
1.8.2