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
webvttdec.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
* WebVTT subtitle decoder
24
* @see http://dev.w3.org/html5/webvtt/
25
* @todo need to support extended markups and cue settings
26
*/
27
28
#include "
avcodec.h
"
29
#include "
ass.h
"
30
#include "
libavutil/bprint.h
"
31
32
static
const
struct
{
33
const
char
*
from
;
34
const
char
*
to
;
35
}
webvtt_tag_replace
[] = {
36
{
"<i>"
,
"{\\i1}"
}, {
"</i>"
,
"{\\i0}"
},
37
{
"<b>"
,
"{\\b1}"
}, {
"</b>"
,
"{\\b0}"
},
38
{
"<u>"
,
"{\\u1}"
}, {
"</u>"
,
"{\\u0}"
},
39
{
"{"
,
"\\{"
}, {
"}"
,
"\\}"
},
// escape to avoid ASS markup conflicts
40
};
41
42
static
int
webvtt_event_to_ass
(AVBPrint *
buf
,
const
char
*p)
43
{
44
int
i, skip = 0;
45
46
while
(*p) {
47
48
for
(i = 0; i <
FF_ARRAY_ELEMS
(
webvtt_tag_replace
); i++) {
49
const
char
*
from
=
webvtt_tag_replace
[i].from;
50
const
size_t
len
= strlen(from);
51
if
(!strncmp(p, from, len)) {
52
av_bprintf
(buf,
"%s"
,
webvtt_tag_replace
[i].
to
);
53
p +=
len
;
54
break
;
55
}
56
}
57
if
(!*p)
58
break
;
59
60
if
(*p ==
'<'
)
61
skip = 1;
62
else
if
(*p ==
'>'
)
63
skip = 0;
64
else
if
(p[0] ==
'\n'
&& p[1])
65
av_bprintf
(buf,
"\\N"
);
66
else
if
(!skip && *p !=
'\r'
)
67
av_bprint_chars
(buf, *p, 1);
68
p++;
69
}
70
return
0;
71
}
72
73
static
int
webvtt_decode_frame
(
AVCodecContext
*avctx,
74
void
*
data
,
int
*got_sub_ptr,
AVPacket
*avpkt)
75
{
76
int
ret
= 0;
77
AVSubtitle
*sub =
data
;
78
const
char
*ptr = avpkt->
data
;
79
AVBPrint
buf
;
80
81
av_bprint_init
(&buf, 0,
AV_BPRINT_SIZE_UNLIMITED
);
82
if
(ptr && avpkt->
size
> 0 && !
webvtt_event_to_ass
(&buf, ptr)) {
83
int
ts_start =
av_rescale_q
(avpkt->
pts
, avctx->
time_base
, (
AVRational
){1,100});
84
int
ts_duration = avpkt->
duration
!= -1 ?
85
av_rescale_q
(avpkt->
duration
, avctx->
time_base
, (
AVRational
){1,100}) : -1;
86
ret
=
ff_ass_add_rect_bprint
(sub, &
buf
, ts_start, ts_duration);
87
}
88
av_bprint_finalize
(&
buf
,
NULL
);
89
if
(
ret
< 0)
90
return
ret
;
91
*got_sub_ptr = sub->num_rects > 0;
92
return
avpkt->size;
93
}
94
95
AVCodec
ff_webvtt_decoder
= {
96
.
name
=
"webvtt"
,
97
.long_name =
NULL_IF_CONFIG_SMALL
(
"WebVTT subtitle"
),
98
.type =
AVMEDIA_TYPE_SUBTITLE
,
99
.id =
AV_CODEC_ID_WEBVTT
,
100
.decode =
webvtt_decode_frame
,
101
.init =
ff_ass_subtitle_header_default
,
102
};
Generated on Sun Mar 8 2015 02:35:03 for FFmpeg by
1.8.2