[FFmpeg-devel] [PATCH 1/2] srtdec: Add timing-less "subrip" decoder.

Clément Bœsch ubitux at gmail.com
Sun Aug 12 11:11:31 CEST 2012


On Sat, Aug 11, 2012 at 08:41:25PM -0700, Philip Langdale wrote:
> After various discussions, we concluded that, amongst other things,
> it made sense to have a separate subrip decoder that did not use
> in-band timing information, and rather relied on the ffmpeg level
> timing.
> 
> As this is 90% the same as the existing srt decoder, it's implemented
> in the same file.
> 
> Signed-off-by: Philip Langdale <philipl at overt.org>
> ---
>  libavcodec/Makefile    |    1 +
>  libavcodec/allcodecs.c |    1 +
>  libavcodec/avcodec.h   |    1 +
>  libavcodec/srtdec.c    |   31 +++++++++++++++++++++++++++----
>  libavcodec/version.h   |    2 +-
>  5 files changed, 31 insertions(+), 5 deletions(-)
> 
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index 911a781..e826885 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -423,6 +423,7 @@ OBJS-$(CONFIG_SONIC_LS_ENCODER)        += sonic.o
>  OBJS-$(CONFIG_SP5X_DECODER)            += sp5xdec.o mjpegdec.o mjpeg.o
>  OBJS-$(CONFIG_SRT_DECODER)             += srtdec.o ass.o
>  OBJS-$(CONFIG_SRT_ENCODER)             += srtenc.o ass_split.o
> +OBJS-$(CONFIG_SUBRIP_DECODER)          += srtdec.o ass.o
>  OBJS-$(CONFIG_SUBVIEWER_DECODER)       += subviewerdec.o ass.o
>  OBJS-$(CONFIG_SUNRAST_DECODER)         += sunrast.o
>  OBJS-$(CONFIG_SUNRAST_ENCODER)         += sunrastenc.o
> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
> index 6b42c30..f7ae449 100644
> --- a/libavcodec/allcodecs.c
> +++ b/libavcodec/allcodecs.c
> @@ -415,6 +415,7 @@ void avcodec_register_all(void)
>      REGISTER_DECODER (REALTEXT, realtext);
>      REGISTER_DECODER (SAMI, sami);
>      REGISTER_ENCDEC  (SRT, srt);
> +    REGISTER_DECODER (SUBRIP, subrip);
>      REGISTER_DECODER (SUBVIEWER, subviewer);
>      REGISTER_ENCDEC  (XSUB, xsub);
>  
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 351e372..c91f4ef 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -441,6 +441,7 @@ enum AVCodecID {
>      AV_CODEC_ID_SAMI       = MKBETAG('S','A','M','I'),
>      AV_CODEC_ID_REALTEXT   = MKBETAG('R','T','X','T'),
>      AV_CODEC_ID_SUBVIEWER  = MKBETAG('S','u','b','V'),
> +    AV_CODEC_ID_SUBRIP,

Please choose MKBETAG('S','R','i','p') or something.

>  
>      /* other specific kind of codecs (generally used for attachments) */
>      AV_CODEC_ID_FIRST_UNKNOWN = 0x18000,           ///< A dummy ID pointing at the start of various fake codecs.
> diff --git a/libavcodec/srtdec.c b/libavcodec/srtdec.c
> index 13e4f9c..6a7812e 100644
> --- a/libavcodec/srtdec.c
> +++ b/libavcodec/srtdec.c
> @@ -217,9 +217,19 @@ static int srt_decode_frame(AVCodecContext *avctx,
>          return avpkt->size;
>  
>      while (ptr < end && *ptr) {
> -        ptr = read_ts(ptr, &ts_start, &ts_end, &x1, &y1, &x2, &y2);
> -        if (!ptr)
> -            break;
> +        if (avctx->codec->id == CODEC_ID_SRT) {
> +            ptr = read_ts(ptr, &ts_start, &ts_end, &x1, &y1, &x2, &y2);
> +            if (!ptr)
> +                break;
> +        } else {
> +            // Do final divide-by-10 outside rescale to force rounding down.
> +            ts_start = av_rescale_q(avpkt->pts,
> +                                    avctx->time_base,
> +                                    (AVRational){1,1000}) / 10;
> +            ts_end   = av_rescale_q(avpkt->pts + avpkt->duration,
> +                                    avctx->time_base,
> +                                    (AVRational){1,1000}) / 10;

Why not rescale to {1,100} and avoid /10?

[...]

Rest LGTM if tested, thank you.

-- 
Clément B.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20120812/78796183/attachment.asc>


More information about the ffmpeg-devel mailing list