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
samidec.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
* SAMI subtitle demuxer
24
* @see http://msdn.microsoft.com/en-us/library/ms971327.aspx
25
*/
26
27
#include "
avformat.h
"
28
#include "
internal.h
"
29
#include "
subtitles.h
"
30
#include "
libavcodec/internal.h
"
31
#include "
libavutil/avstring.h
"
32
#include "
libavutil/bprint.h
"
33
#include "
libavutil/intreadwrite.h
"
34
35
typedef
struct
{
36
FFDemuxSubtitlesQueue
q
;
37
}
SAMIContext
;
38
39
static
int
sami_probe
(
AVProbeData
*p)
40
{
41
char
buf
[6];
42
FFTextReader
tr;
43
ff_text_init_buf
(&tr, p->
buf
, p->
buf_size
);
44
ff_text_read
(&tr, buf,
sizeof
(buf));
45
46
return
!strncmp(buf,
"<SAMI>"
, 6) ?
AVPROBE_SCORE_MAX
: 0;
47
}
48
49
static
int
sami_read_header
(
AVFormatContext
*
s
)
50
{
51
SAMIContext
*sami = s->
priv_data
;
52
AVStream
*st =
avformat_new_stream
(s,
NULL
);
53
AVBPrint
buf
, hdr_buf;
54
char
c
= 0;
55
int
res = 0, got_first_sync_point = 0;
56
FFTextReader
tr;
57
ff_text_init_avio
(s, &tr, s->
pb
);
58
59
if
(!st)
60
return
AVERROR
(ENOMEM);
61
avpriv_set_pts_info
(st, 64, 1, 1000);
62
st->
codec
->
codec_type
=
AVMEDIA_TYPE_SUBTITLE
;
63
st->
codec
->
codec_id
=
AV_CODEC_ID_SAMI
;
64
65
av_bprint_init
(&buf, 0,
AV_BPRINT_SIZE_UNLIMITED
);
66
av_bprint_init
(&hdr_buf, 0,
AV_BPRINT_SIZE_UNLIMITED
);
67
68
while
(!
ff_text_eof
(&tr)) {
69
AVPacket
*sub;
70
const
int64_t pos =
ff_text_pos
(&tr) - (c != 0);
71
int
is_sync,
n
=
ff_smil_extract_next_text_chunk
(&tr, &buf, &c);
72
73
if
(n == 0)
74
break
;
75
76
is_sync = !
av_strncasecmp
(buf.str,
"<SYNC"
, 5);
77
if
(is_sync)
78
got_first_sync_point = 1;
79
80
if
(!got_first_sync_point) {
81
av_bprintf
(&hdr_buf,
"%s"
, buf.str);
82
}
else
{
83
sub =
ff_subtitles_queue_insert
(&sami->
q
, buf.str, buf.len, !is_sync);
84
if
(!sub) {
85
res =
AVERROR
(ENOMEM);
86
goto
end
;
87
}
88
if
(is_sync) {
89
const
char
*p =
ff_smil_get_attr_ptr
(buf.str,
"Start"
);
90
sub->
pos
= pos;
91
sub->
pts
= p ? strtol(p,
NULL
, 10) : 0;
92
sub->
duration
= -1;
93
}
94
}
95
av_bprint_clear
(&buf);
96
}
97
98
res =
avpriv_bprint_to_extradata
(st->
codec
, &hdr_buf);
99
if
(res < 0)
100
goto
end
;
101
102
ff_subtitles_queue_finalize
(&sami->
q
);
103
104
end
:
105
av_bprint_finalize
(&buf,
NULL
);
106
return
res;
107
}
108
109
static
int
sami_read_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
110
{
111
SAMIContext
*sami = s->
priv_data
;
112
return
ff_subtitles_queue_read_packet
(&sami->
q
, pkt);
113
}
114
115
static
int
sami_read_seek
(
AVFormatContext
*
s
,
int
stream_index,
116
int64_t min_ts, int64_t ts, int64_t max_ts,
int
flags
)
117
{
118
SAMIContext
*sami = s->
priv_data
;
119
return
ff_subtitles_queue_seek
(&sami->
q
, s, stream_index,
120
min_ts, ts, max_ts, flags);
121
}
122
123
static
int
sami_read_close
(
AVFormatContext
*
s
)
124
{
125
SAMIContext
*sami = s->
priv_data
;
126
ff_subtitles_queue_clean
(&sami->
q
);
127
return
0;
128
}
129
130
AVInputFormat
ff_sami_demuxer
= {
131
.
name
=
"sami"
,
132
.long_name =
NULL_IF_CONFIG_SMALL
(
"SAMI subtitle format"
),
133
.priv_data_size =
sizeof
(
SAMIContext
),
134
.
read_probe
=
sami_probe
,
135
.
read_header
=
sami_read_header
,
136
.
read_packet
=
sami_read_packet
,
137
.read_seek2 =
sami_read_seek
,
138
.
read_close
=
sami_read_close
,
139
.extensions =
"smi,sami"
,
140
};
Generated on Sun Mar 8 2015 02:34:59 for FFmpeg by
1.8.2