[FFmpeg-devel] [PATCH] avcodec/samidec: fix misposition of subtitles caused by rounding

Jeong-Hoon Seo sjh431 at gmail.com
Mon Dec 1 01:47:11 CET 2014


Thanks for your point of view.

I'll fix properly and submit later.

2014-11-27 5:53 GMT+09:00 Clément Bœsch <u at pkh.me>:

> On Tue, Nov 25, 2014 at 06:07:30PM +0900, Jeong-Hoon Seo wrote:
> > SAMI and ASS have different precision of duration in FFMPEG
> > (SAMI: millisecond, ASS: centisecond)
> > Sometimes, start-time of current subtitle is overrun with end-time of
> previous one by rounding process
> > This led to misposition of subtitles
> >   <exmple>
> >   - input SAMI
> >   <sync start=1155>
> >     <p class=ENCC> start
> >   <sync start=2850>
> >     <p class=ENCC> end
> >   <sync start=3850>
> >     <p class=ENCC> !
> >   - convert ASS
> >   Dialogue: 0,0:00:01:16,0:00:02:86,Default,start
> >   Dialogue: 0,0:00:02:85,0:00:03:85,Default,end
> >   ...
> >
> >   each values in ASS means "Format": "Layer","Start","End","Style","Text"
> >   "End" value = <sync start> + rounding(difference of <sync start>)
> >   0:00:02:86 = 0:00:01:16 + rounding(2850-1151)
> >
> > in the converted ASS,
> > start-time of 2nd "Text" is overrun by end-time of 1st "Text",
> > and some frames will overlaid with multi-line text
> > (during 0:00:02:85~0:00:02:86, 2nd one is on top of 1st one)
> > After 1st text end-time(expired), 2nd one keep previous
> position(misposition)
> > ---
> >  libavcodec/samidec.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
> >
> > diff --git a/libavcodec/samidec.c b/libavcodec/samidec.c
> > index 7705f93..92a9863 100644
> > --- a/libavcodec/samidec.c
> > +++ b/libavcodec/samidec.c
> > @@ -119,9 +119,9 @@ static int sami_decode_frame(AVCodecContext *avctx,
> >      SAMIContext *sami = avctx->priv_data;
> >
> >      if (ptr && avpkt->size > 0 && !sami_paragraph_to_ass(avctx, ptr)) {
> > -        int ts_start     = av_rescale_q(avpkt->pts, avctx->time_base,
> (AVRational){1,100});
> > +        int ts_start     = av_rescale_q_rnd(avpkt->pts,
> avctx->time_base, (AVRational){1,100}, AV_ROUND_ZERO);
> >          int ts_duration  = avpkt->duration != -1 ?
> > -                           av_rescale_q(avpkt->duration,
> avctx->time_base, (AVRational){1,100}) : -1;
> > +                           av_rescale_q_rnd(avpkt->duration,
> avctx->time_base, (AVRational){1,100}, AV_ROUND_ZERO) : -1;
> >          int ret = ff_ass_add_rect_bprint(sub, &sami->full, ts_start,
> ts_duration);
> >          if (ret < 0)
> >              return ret;
>
> Well I'm fine with this but:
>  - does the FATE test need updates?
>  - this change is required in other text subtitles decoders as well
>  - the subtitles decoders shouldn't have this code in the first place, so
>    be aware this isn't the proper fix (but is an acceptable change in
>    itself)
>
> Note: I'm working on dropping that code altogether, but it takes some
> time
>
> [...]
>
> --
> Clément B.
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>


More information about the ffmpeg-devel mailing list