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
subtitles.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2012 Clément Bœsch
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
#ifndef AVFORMAT_SUBTITLES_H
22
#define AVFORMAT_SUBTITLES_H
23
24
#include <stdint.h>
25
#include <stddef.h>
26
#include "
avformat.h
"
27
#include "
libavutil/bprint.h
"
28
29
enum
sub_sort
{
30
SUB_SORT_TS_POS
= 0,
///< sort by timestamps, then position
31
SUB_SORT_POS_TS
,
///< sort by position, then timestamps
32
};
33
34
enum
ff_utf_type
{
35
FF_UTF_8
,
// or other 8 bit encodings
36
FF_UTF16LE
,
37
FF_UTF16BE
,
38
};
39
40
typedef
struct
{
41
int
type
;
42
AVIOContext
*
pb
;
43
unsigned
char
buf
[8];
44
int
buf_pos
, buf_len;
45
AVIOContext
buf_pb
;
46
}
FFTextReader
;
47
48
/**
49
* Initialize the FFTextReader from the given AVIOContext. This function will
50
* read some bytes from pb, and test for UTF-8 or UTF-16 BOMs. Further accesses
51
* to FFTextReader will read more data from pb.
52
* If s is not NULL, the user will be warned if a UTF-16 conversion takes place.
53
*
54
* The purpose of FFTextReader is to transparently convert read data to UTF-8
55
* if the stream had a UTF-16 BOM.
56
*
57
* @param s Pointer to provide av_log context
58
* @param r object which will be initialized
59
* @param pb stream to read from (referenced as long as FFTextReader is in use)
60
*/
61
void
ff_text_init_avio
(
void
*
s
,
FFTextReader
*
r
,
AVIOContext
*pb);
62
63
/**
64
* Similar to ff_text_init_avio(), but sets it up to read from a bounded buffer.
65
*
66
* @param r object which will be initialized
67
* @param buf buffer to read from (referenced as long as FFTextReader is in use)
68
* @param size size of buf
69
*/
70
void
ff_text_init_buf
(
FFTextReader
*
r
,
void
*
buf
,
size_t
size
);
71
72
/**
73
* Return the byte position of the next byte returned by ff_text_r8(). For
74
* UTF-16 source streams, this will return the original position, but it will
75
* be incorrect if a codepoint was only partially read with ff_text_r8().
76
*/
77
int64_t
ff_text_pos
(
FFTextReader
*
r
);
78
79
/**
80
* Return the next byte. The return value is always 0 - 255. Returns 0 on EOF.
81
* If the source stream is UTF-16, this reads from the stream converted to
82
* UTF-8. On invalid UTF-16, 0 is returned.
83
*/
84
int
ff_text_r8
(
FFTextReader
*
r
);
85
86
/**
87
* Return non-zero if EOF was reached.
88
*/
89
int
ff_text_eof
(
FFTextReader
*
r
);
90
91
/**
92
* Like ff_text_r8(), but don't remove the byte from the buffer.
93
*/
94
int
ff_text_peek_r8
(
FFTextReader
*
r
);
95
96
/**
97
* Read the given number of bytes (in UTF-8). On error or EOF, \0 bytes are
98
* written.
99
*/
100
void
ff_text_read
(
FFTextReader
*
r
,
char
*
buf
,
size_t
size
);
101
102
typedef
struct
{
103
AVPacket
*
subs
;
///< array of subtitles packets
104
int
nb_subs
;
///< number of subtitles packets
105
int
allocated_size
;
///< allocated size for subs
106
int
current_sub_idx
;
///< current position for the read packet callback
107
enum
sub_sort
sort
;
///< sort method to use when finalizing subtitles
108
}
FFDemuxSubtitlesQueue
;
109
110
/**
111
* Insert a new subtitle event.
112
*
113
* @param event the subtitle line, may not be zero terminated
114
* @param len the length of the event (in strlen() sense, so without '\0')
115
* @param merge set to 1 if the current event should be concatenated with the
116
* previous one instead of adding a new entry, 0 otherwise
117
*/
118
AVPacket
*
ff_subtitles_queue_insert
(
FFDemuxSubtitlesQueue
*q,
119
const
uint8_t
*event,
int
len
,
int
merge
);
120
121
/**
122
* Set missing durations and sort subtitles by PTS, and then byte position.
123
*/
124
void
ff_subtitles_queue_finalize
(
FFDemuxSubtitlesQueue
*q);
125
126
/**
127
* Generic read_packet() callback for subtitles demuxers using this queue
128
* system.
129
*/
130
int
ff_subtitles_queue_read_packet
(
FFDemuxSubtitlesQueue
*q,
AVPacket
*
pkt
);
131
132
/**
133
* Update current_sub_idx to emulate a seek. Except the first parameter, it
134
* matches AVInputFormat->read_seek2 prototypes.
135
*/
136
int
ff_subtitles_queue_seek
(
FFDemuxSubtitlesQueue
*q,
AVFormatContext
*
s
,
int
stream_index,
137
int64_t min_ts, int64_t ts, int64_t max_ts,
int
flags
);
138
139
/**
140
* Remove and destroy all the subtitles packets.
141
*/
142
void
ff_subtitles_queue_clean
(
FFDemuxSubtitlesQueue
*q);
143
144
/**
145
* SMIL helper to load next chunk ("<...>" or untagged content) in buf.
146
*
147
* @param c cached character, to avoid a backward seek
148
*/
149
int
ff_smil_extract_next_text_chunk
(
FFTextReader
*tr, AVBPrint *
buf
,
char
*
c
);
150
151
/**
152
* SMIL helper to point on the value of an attribute in the given tag.
153
*
154
* @param s SMIL tag ("<...>")
155
* @param attr the attribute to look for
156
*/
157
const
char
*
ff_smil_get_attr_ptr
(
const
char
*
s
,
const
char
*attr);
158
159
/**
160
* @brief Same as ff_subtitles_read_text_chunk(), but read from an AVIOContext.
161
*/
162
void
ff_subtitles_read_chunk
(
AVIOContext
*pb, AVBPrint *
buf
);
163
164
/**
165
* @brief Read a subtitles chunk from FFTextReader.
166
*
167
* A chunk is defined by a multiline "event", ending with a second line break.
168
* The trailing line breaks are trimmed. CRLF are supported.
169
* Example: "foo\r\nbar\r\n\r\nnext" will print "foo\r\nbar" into buf, and pb
170
* will focus on the 'n' of the "next" string.
171
*
172
* @param tr I/O context
173
* @param buf an initialized buf where the chunk is written
174
*
175
* @note buf is cleared before writing into it.
176
*/
177
void
ff_subtitles_read_text_chunk
(
FFTextReader
*tr, AVBPrint *
buf
);
178
179
/**
180
* Get the number of characters to increment to jump to the next line, or to
181
* the end of the string.
182
* The function handles the following line breaks schemes:
183
* LF, CRLF (MS), or standalone CR (old MacOS).
184
*/
185
static
av_always_inline
int
ff_subtitles_next_line
(
const
char
*ptr)
186
{
187
int
n
= strcspn(ptr,
"\r\n"
);
188
ptr +=
n
;
189
if
(*ptr ==
'\r'
) {
190
ptr++;
191
n++;
192
}
193
if
(*ptr ==
'\n'
)
194
n++;
195
return
n
;
196
}
197
198
/**
199
* Read a line of text. Discards line ending characters.
200
* The function handles the following line breaks schemes:
201
* LF, CRLF (MS), or standalone CR (old MacOS).
202
*
203
* Returns the number of bytes written to buf. Always writes a terminating 0,
204
* similar as with snprintf.
205
*
206
* @note returns a negative error code if a \0 byte is found
207
*/
208
ptrdiff_t
ff_subtitles_read_line
(
FFTextReader
*tr,
char
*
buf
,
size_t
size
);
209
210
#endif
/* AVFORMAT_SUBTITLES_H */
Generated on Sun Mar 8 2015 02:35:12 for FFmpeg by
1.8.2