[FFmpeg-devel] [PATCH] avcodec/htmlsubtitles: Factor open brace handling into its own function
Michael Niedermayer
michael at niedermayer.cc
Tue Jun 13 16:10:33 EEST 2017
On Tue, Jun 13, 2017 at 01:19:56PM +0200, wm4 wrote:
> On Tue, 13 Jun 2017 00:01:04 +0200
> Michael Niedermayer <michael at niedermayer.cc> wrote:
>
> > Suggested-by: wm4
> > Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> > ---
> > libavcodec/htmlsubtitles.c | 44 ++++++++++++++++++++++++++------------------
> > 1 file changed, 26 insertions(+), 18 deletions(-)
> >
> > diff --git a/libavcodec/htmlsubtitles.c b/libavcodec/htmlsubtitles.c
> > index 70311c66d5..be5c9316ca 100644
> > --- a/libavcodec/htmlsubtitles.c
> > +++ b/libavcodec/htmlsubtitles.c
> > @@ -51,6 +51,30 @@ static void rstrip_spaces_buf(AVBPrint *buf)
> > buf->str[--buf->len] = 0;
> > }
> >
> > +/* skip all {\xxx} substrings except for {\an%d}
> > + and all microdvd like styles such as {Y:xxx} */
> > +static void handle_open_brace(AVBPrint *dst, const char **inp, int *an, int *closing_brace_missing)
> > +{
> > + int len = 0;
> > + const char *in = *inp;
> > +
> > + *an += sscanf(in, "{\\an%*1u}%n", &len) >= 0 && len > 0;
> > +
> > + if (!*closing_brace_missing) {
> > + if ( (*an != 1 && in[1] == '\\')
> > + || (in[1] && strchr("CcFfoPSsYy", in[1]) && in[2] == ':')) {
> > + char *bracep = strchr(in+2, '}');
> > + if (bracep) {
> > + *inp = bracep;
> > + return;
> > + } else
> > + *closing_brace_missing = 1;
> > + }
> > + }
> > +
> > + av_bprint_chars(dst, *in, 1);
> > +}
> > +
> > int ff_htmlmarkup_to_ass(void *log_ctx, AVBPrint *dst, const char *in)
> > {
> > char *param, buffer[128], tmp[128];
> > @@ -80,24 +104,8 @@ int ff_htmlmarkup_to_ass(void *log_ctx, AVBPrint *dst, const char *in)
> > if (!line_start)
> > av_bprint_chars(dst, *in, 1);
> > break;
> > - case '{': /* skip all {\xxx} substrings except for {\an%d}
> > - and all microdvd like styles such as {Y:xxx} */
> > - len = 0;
> > - an += sscanf(in, "{\\an%*1u}%n", &len) >= 0 && len > 0;
> > -
> > - if (!closing_brace_missing) {
> > - if ( (an != 1 && in[1] == '\\')
> > - || (in[1] && strchr("CcFfoPSsYy", in[1]) && in[2] == ':')) {
> > - char *bracep = strchr(in+2, '}');
> > - if (bracep) {
> > - in = bracep;
> > - break;
> > - } else
> > - closing_brace_missing = 1;
> > - }
> > - }
> > -
> > - av_bprint_chars(dst, *in, 1);
> > + case '{':
> > + handle_open_brace(dst, &in, &an, &closing_brace_missing);
> > break;
> > case '<':
> > tag_close = in[1] == '/';
>
> Looked at the an thing again (at the old code in git master). It makes
> no sense to me - skipping should always behave the same.
>
> Maybe it's actually a bug, or it attempted to emit subsequent an tags
> by trying to be overly clever.
>
> In theory, only 1 an tag is ok per line, so "{\an1}{\an2}" the second
> an tag would either do nothing, or override the first tag. Maybe
> someone thought it'd be reasonable to skip the an second tag, but I
> don't see how it matters.
>
> It could also be an attempt to get the same behavior between libass and
> VSFitler between redundant an tags (maybe VSFilter uses the value of
> the first tag, while libass uses the second tag). Then I'd say this
> should be fixed in libass instead.
>
> Anyway, I'd remove that extra an handling. It's a good example of
> overly complicated code that makes everything less readable for
> absolutely no reason. (Unless I'm overlooking something obvious.)
ok, ive sent a patch that does that
>
> Rest LGTM.
will apply the 3 patches in a day or 2 unless there are more comments
thx
[...9
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
I do not agree with what you have to say, but I'll defend to the death your
right to say it. -- Voltaire
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20170613/cdcfb96a/attachment.sig>
More information about the ffmpeg-devel
mailing list