FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavformat
assenc.c
Go to the documentation of this file.
1
/*
2
* SSA/ASS muxer
3
* Copyright (c) 2008 Michael Niedermayer
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
24
typedef
struct
ASSContext
{
25
unsigned
int
extra_index
;
26
}
ASSContext
;
27
28
static
int
write_header
(
AVFormatContext
*s)
29
{
30
ASSContext
*ass = s->
priv_data
;
31
AVCodecContext
*avctx= s->
streams
[0]->
codec
;
32
uint8_t
*last=
NULL
;
33
34
if
(s->
nb_streams
!= 1 || avctx->
codec_id
!=
AV_CODEC_ID_SSA
){
35
av_log
(s,
AV_LOG_ERROR
,
"Exactly one ASS/SSA stream is needed.\n"
);
36
return
-1;
37
}
38
39
while
(ass->
extra_index
< avctx->
extradata_size
){
40
uint8_t
*p = avctx->
extradata
+ ass->
extra_index
;
41
uint8_t
*
end
= strchr(p,
'\n'
);
42
if
(!end) end= avctx->
extradata
+ avctx->
extradata_size
;
43
else
end++;
44
45
avio_write
(s->
pb
, p, end-p);
46
ass->
extra_index
+= end-p;
47
48
if
(last && !memcmp(last,
"[Events]"
, 8))
49
break
;
50
last=p;
51
}
52
53
avio_flush
(s->
pb
);
54
55
return
0;
56
}
57
58
static
int
write_packet
(
AVFormatContext
*s,
AVPacket
*
pkt
)
59
{
60
avio_write
(s->
pb
, pkt->
data
, pkt->
size
);
61
62
avio_flush
(s->
pb
);
63
64
return
0;
65
}
66
67
static
int
write_trailer
(
AVFormatContext
*s)
68
{
69
ASSContext
*ass = s->
priv_data
;
70
AVCodecContext
*avctx= s->
streams
[0]->
codec
;
71
72
avio_write
(s->
pb
, avctx->
extradata
+ ass->
extra_index
,
73
avctx->
extradata_size
- ass->
extra_index
);
74
75
return
0;
76
}
77
78
AVOutputFormat
ff_ass_muxer
= {
79
.
name
=
"ass"
,
80
.long_name =
NULL_IF_CONFIG_SMALL
(
"SSA (SubStation Alpha) subtitle"
),
81
.mime_type =
"text/x-ssa"
,
82
.extensions =
"ass,ssa"
,
83
.priv_data_size =
sizeof
(
ASSContext
),
84
.subtitle_codec =
AV_CODEC_ID_SSA
,
85
.
write_header
=
write_header
,
86
.
write_packet
=
write_packet
,
87
.
write_trailer
=
write_trailer
,
88
.
flags
=
AVFMT_GLOBALHEADER
|
AVFMT_NOTIMESTAMPS
|
AVFMT_TS_NONSTRICT
,
89
};
Generated on Sat May 25 2013 03:58:31 for FFmpeg by
1.8.2