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
libavcodec
realtextdec.c
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
/**
22
* @file
23
* RealText subtitle decoder
24
* @see http://service.real.com/help/library/guides/ProductionGuide/prodguide/htmfiles/realtext.htm
25
*/
26
27
#include "
avcodec.h
"
28
#include "
ass.h
"
29
#include "
libavutil/avstring.h
"
30
#include "
libavutil/bprint.h
"
31
32
static
int
rt_event_to_ass
(
AVBPrint
*
buf
,
const
char
*p)
33
{
34
int
prev_chr_is_space = 1;
35
36
while
(*p) {
37
if
(*p !=
'<'
) {
38
if
(!
av_isspace
(*p))
39
av_bprint_chars
(buf, *p, 1);
40
else
if
(!prev_chr_is_space)
41
av_bprint_chars
(buf,
' '
, 1);
42
prev_chr_is_space =
av_isspace
(*p);
43
}
else
{
44
const
char
*
end
= strchr(p,
'>'
);
45
if
(!end)
46
break
;
47
if
(!
av_strncasecmp
(p,
"<br/>"
, 5) ||
48
!
av_strncasecmp
(p,
"<br>"
, 4)) {
49
av_bprintf
(buf,
"\\N"
);
50
}
51
p =
end
;
52
}
53
p++;
54
}
55
av_bprintf
(buf,
"\r\n"
);
56
return
0;
57
}
58
59
static
int
realtext_decode_frame
(
AVCodecContext
*avctx,
60
void
*
data
,
int
*got_sub_ptr,
AVPacket
*avpkt)
61
{
62
AVSubtitle
*sub =
data
;
63
const
char
*ptr = avpkt->
data
;
64
AVBPrint
buf
;
65
66
av_bprint_init
(&buf, 0, 4096);
67
// note: no need to rescale pts & duration since they are in the same
68
// timebase as ASS (1/100)
69
if
(ptr && avpkt->
size
> 0 && !
rt_event_to_ass
(&buf, ptr))
70
ff_ass_add_rect
(sub, buf.str, avpkt->
pts
, avpkt->
duration
, 0);
71
*got_sub_ptr = sub->
num_rects
> 0;
72
av_bprint_finalize
(&buf, NULL);
73
return
avpkt->
size
;
74
}
75
76
AVCodec
ff_realtext_decoder
= {
77
.
name
=
"realtext"
,
78
.long_name =
NULL_IF_CONFIG_SMALL
(
"RealText subtitle"
),
79
.type =
AVMEDIA_TYPE_SUBTITLE
,
80
.id =
AV_CODEC_ID_REALTEXT
,
81
.decode =
realtext_decode_frame
,
82
.init =
ff_ass_subtitle_header_default
,
83
};
Generated on Sun Mar 23 2014 23:50:02 for FFmpeg by
1.8.2