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
srtenc.c
Go to the documentation of this file.
1
/*
2
* SubRip subtitle muxer
3
* Copyright (c) 2012 Nicolas George <nicolas.george@normalesup.org>
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include "
avformat.h
"
23
#include "
internal.h
"
24
#include "
libavutil/log.h
"
25
#include "
libavutil/intreadwrite.h
"
26
27
/* TODO: add options for:
28
- character encoding;
29
- LF / CRLF;
30
- byte order mark.
31
*/
32
33
typedef
struct
SRTContext
{
34
unsigned
index
;
35
}
SRTContext
;
36
37
static
int
srt_write_header
(
AVFormatContext
*avf)
38
{
39
SRTContext
*srt = avf->
priv_data
;
40
41
if
(avf->
nb_streams
!= 1 ||
42
avf->
streams
[0]->
codec
->
codec_type
!=
AVMEDIA_TYPE_SUBTITLE
) {
43
av_log
(avf,
AV_LOG_ERROR
,
44
"SRT supports only a single subtitles stream.\n"
);
45
return
AVERROR
(EINVAL);
46
}
47
if
(avf->
streams
[0]->
codec
->
codec_id
!=
AV_CODEC_ID_TEXT
&&
48
avf->
streams
[0]->
codec
->
codec_id
!=
AV_CODEC_ID_SUBRIP
&&
49
avf->
streams
[0]->
codec
->
codec_id
!=
AV_CODEC_ID_SRT
) {
50
av_log
(avf,
AV_LOG_ERROR
,
51
"Unsupported subtitles codec: %s\n"
,
52
avcodec_get_name
(avf->
streams
[0]->
codec
->
codec_id
));
53
return
AVERROR
(EINVAL);
54
}
55
avpriv_set_pts_info
(avf->
streams
[0], 64, 1, 1000);
56
srt->
index
= 1;
57
return
0;
58
}
59
60
static
int
srt_write_packet
(
AVFormatContext
*avf,
AVPacket
*
pkt
)
61
{
62
SRTContext
*srt = avf->
priv_data
;
63
int
write_ts = avf->
streams
[0]->
codec
->
codec_id
!=
AV_CODEC_ID_SRT
;
64
65
if
(write_ts) {
66
int64_t
s
= pkt->
pts
, e, d = pkt->
duration
;
67
int
size
, x1 = -1, y1 = -1, x2 = -1, y2 = -1;
68
const
uint8_t
*p;
69
70
p =
av_packet_get_side_data
(pkt,
AV_PKT_DATA_SUBTITLE_POSITION
, &size);
71
if
(p && size == 16) {
72
x1 =
AV_RL32
(p );
73
y1 =
AV_RL32
(p + 4);
74
x2 =
AV_RL32
(p + 8);
75
y2 =
AV_RL32
(p + 12);
76
}
77
78
if
(d <= 0)
79
/* For backward compatibility, fallback to convergence_duration. */
80
d = pkt->
convergence_duration
;
81
if
(s ==
AV_NOPTS_VALUE
|| d < 0) {
82
av_log
(avf,
AV_LOG_WARNING
,
83
"Insufficient timestamps in event number %d.\n"
, srt->
index
);
84
return
0;
85
}
86
e = s + d;
87
avio_printf
(avf->
pb
,
"%d\n%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d"
,
88
srt->
index
,
89
(
int
)(s / 3600000), (
int
)(s / 60000) % 60,
90
(
int
)(s / 1000) % 60, (
int
)(s % 1000),
91
(
int
)(e / 3600000), (
int
)(e / 60000) % 60,
92
(
int
)(e / 1000) % 60, (
int
)(e % 1000));
93
if
(p)
94
avio_printf
(avf->
pb
,
" X1:%03d X2:%03d Y1:%03d Y2:%03d"
,
95
x1, x2, y1, y2);
96
avio_printf
(avf->
pb
,
"\n"
);
97
}
98
avio_write
(avf->
pb
, pkt->
data
, pkt->
size
);
99
if
(write_ts)
100
avio_write
(avf->
pb
,
"\n\n"
, 2);
101
srt->
index
++;
102
return
0;
103
}
104
105
AVOutputFormat
ff_srt_muxer
= {
106
.
name
=
"srt"
,
107
.long_name =
NULL_IF_CONFIG_SMALL
(
"SubRip subtitle"
),
108
.mime_type =
"application/x-subrip"
,
109
.extensions =
"srt"
,
110
.priv_data_size =
sizeof
(
SRTContext
),
111
.
write_header
=
srt_write_header
,
112
.
write_packet
=
srt_write_packet
,
113
.
flags
=
AVFMT_VARIABLE_FPS
|
AVFMT_TS_NONSTRICT
,
114
.subtitle_codec =
AV_CODEC_ID_SUBRIP
,
115
};
Generated on Sun Mar 23 2014 23:50:03 for FFmpeg by
1.8.2