Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
b96325e0
Commit
b96325e0
authored
Oct 23, 2013
by
Marton Balint
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ass: move text_event_to_ass from textdec.c to ass.c and export it
Signed-off-by:
Marton Balint
<
cus@passwd.hu
>
parent
0f0a8d98
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
54 additions
and
42 deletions
+54
-42
ass.c
libavcodec/ass.c
+39
-0
ass.h
libavcodec/ass.h
+12
-0
textdec.c
libavcodec/textdec.c
+3
-42
No files found.
libavcodec/ass.c
View file @
b96325e0
...
...
@@ -148,3 +148,42 @@ err:
av_bprint_finalize
(
&
buf
,
NULL
);
return
ret
;
}
void
ff_ass_bprint_text_event
(
AVBPrint
*
buf
,
const
char
*
p
,
int
size
,
const
char
*
linebreaks
,
int
keep_ass_markup
)
{
const
char
*
p_end
=
p
+
size
;
for
(;
p
<
p_end
&&
*
p
;
p
++
)
{
/* forced custom line breaks, not accounted as "normal" EOL */
if
(
linebreaks
&&
strchr
(
linebreaks
,
*
p
))
{
av_bprintf
(
buf
,
"
\\
N"
);
/* standard ASS escaping so random characters don't get mis-interpreted
* as ASS */
}
else
if
(
!
keep_ass_markup
&&
strchr
(
"{}
\\
"
,
*
p
))
{
av_bprintf
(
buf
,
"
\\
%c"
,
*
p
);
/* some packets might end abruptly (no \0 at the end, like for example
* in some cases of demuxing from a classic video container), some
* might be terminated with \n or \r\n which we have to remove (for
* consistency with those who haven't), and we also have to deal with
* evil cases such as \r at the end of the buffer (and no \0 terminated
* character) */
}
else
if
(
p
[
0
]
==
'\n'
)
{
/* some stuff left so we can insert a line break */
if
(
p
<
p_end
-
1
)
av_bprintf
(
buf
,
"
\\
N"
);
}
else
if
(
p
[
0
]
==
'\r'
&&
p
<
p_end
-
1
&&
p
[
1
]
==
'\n'
)
{
/* \r followed by a \n, we can skip it. We don't insert the \N yet
* because we don't know if it is followed by more text */
continue
;
/* finally, a sane character */
}
else
{
av_bprint_chars
(
buf
,
*
p
,
1
);
}
}
av_bprintf
(
buf
,
"
\r\n
"
);
}
libavcodec/ass.h
View file @
b96325e0
...
...
@@ -113,4 +113,16 @@ int ff_ass_add_rect(AVSubtitle *sub, const char *dialog,
int
ff_ass_bprint_dialog
(
AVBPrint
*
buf
,
const
char
*
dialog
,
int
ts_start
,
int
duration
,
int
raw
);
/**
* Escape a text subtitle using ASS syntax into an AVBPrint buffer.
* Newline characters will be escaped to \N.
*
* @param buf pointer to an initialized AVBPrint buffer
* @param p source text
* @param size size of the source text
* @param linebreaks additional newline chars, which will be escaped to \N
* @param keep_ass_markup braces and backslash will not be escaped if set
*/
void
ff_ass_bprint_text_event
(
AVBPrint
*
buf
,
const
char
*
p
,
int
size
,
const
char
*
linebreaks
,
int
keep_ass_markup
);
#endif
/* AVCODEC_ASS_H */
libavcodec/textdec.c
View file @
b96325e0
...
...
@@ -41,59 +41,20 @@ static const AVOption options[] = {
{
NULL
}
};
static
int
text_event_to_ass
(
const
AVCodecContext
*
avctx
,
AVBPrint
*
buf
,
const
char
*
p
,
const
char
*
p_end
)
{
const
TextContext
*
text
=
avctx
->
priv_data
;
for
(;
p
<
p_end
&&
*
p
;
p
++
)
{
/* forced custom line breaks, not accounted as "normal" EOL */
if
(
text
->
linebreaks
&&
strchr
(
text
->
linebreaks
,
*
p
))
{
av_bprintf
(
buf
,
"
\\
N"
);
/* standard ASS escaping so random characters don't get mis-interpreted
* as ASS */
}
else
if
(
!
text
->
keep_ass_markup
&&
strchr
(
"{}
\\
"
,
*
p
))
{
av_bprintf
(
buf
,
"
\\
%c"
,
*
p
);
/* some packets might end abruptly (no \0 at the end, like for example
* in some cases of demuxing from a classic video container), some
* might be terminated with \n or \r\n which we have to remove (for
* consistency with those who haven't), and we also have to deal with
* evil cases such as \r at the end of the buffer (and no \0 terminated
* character) */
}
else
if
(
p
[
0
]
==
'\n'
)
{
/* some stuff left so we can insert a line break */
if
(
p
<
p_end
-
1
)
av_bprintf
(
buf
,
"
\\
N"
);
}
else
if
(
p
[
0
]
==
'\r'
&&
p
<
p_end
-
1
&&
p
[
1
]
==
'\n'
)
{
/* \r followed by a \n, we can skip it. We don't insert the \N yet
* because we don't know if it is followed by more text */
continue
;
/* finally, a sane character */
}
else
{
av_bprint_chars
(
buf
,
*
p
,
1
);
}
}
av_bprintf
(
buf
,
"
\r\n
"
);
return
0
;
}
static
int
text_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_sub_ptr
,
AVPacket
*
avpkt
)
{
AVBPrint
buf
;
AVSubtitle
*
sub
=
data
;
const
char
*
ptr
=
avpkt
->
data
;
const
TextContext
*
text
=
avctx
->
priv_data
;
const
int
ts_start
=
av_rescale_q
(
avpkt
->
pts
,
avctx
->
time_base
,
(
AVRational
){
1
,
100
});
const
int
ts_duration
=
avpkt
->
duration
!=
-
1
?
av_rescale_q
(
avpkt
->
duration
,
avctx
->
time_base
,
(
AVRational
){
1
,
100
})
:
-
1
;
av_bprint_init
(
&
buf
,
0
,
AV_BPRINT_SIZE_UNLIMITED
);
if
(
ptr
&&
avpkt
->
size
>
0
&&
*
ptr
&&
!
text_event_to_ass
(
avctx
,
&
buf
,
ptr
,
ptr
+
avpkt
->
size
))
{
if
(
ptr
&&
avpkt
->
size
>
0
&&
*
ptr
)
{
ff_ass_bprint_text_event
(
&
buf
,
ptr
,
avpkt
->
size
,
text
->
linebreaks
,
text
->
keep_ass_markup
);
if
(
!
av_bprint_is_complete
(
&
buf
))
{
av_bprint_finalize
(
&
buf
,
NULL
);
return
AVERROR
(
ENOMEM
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment