[FFmpeg-devel] [PATCH] matroskadec, matroskadec, srtenc: Read/Write duration for subtitles.

Alexander Strasser eclipse7 at gmx.net
Sun Aug 5 03:37:42 CEST 2012


Hi,

Philip Langdale wrote:
> Ok, let's get this sorted out once and for all.
> 
> I can't see any reason to manipulate the convergence duration instead.
> These subtitle packets are the moral equivalent of keyframes, and
> while the documentation says it should be used for 'some types of
> subtitles', I don't see how Matroska or srt text subtitles fall into
> that category.
> 
> The original claim was that convergence_duration was needed to avoid
> overflow on long duration subtitles. This claim seems questionable.
> If we consider the typical timebase of 1/1000, that still allows
> for a duration of 8 years. For a 1/1000000 timebase, you still get
> a 71 minute maximum duration, so I'm not sure where this claim
> originated from. Only if you go down to a 1ns timebase do you end
> up with a short max duration of ~4 seconds. Am I missing something?
> 
> This change is backward compatible by reading and writing
> convergence_duration. I don't know if that's really necessary.

  I am in favor of your patch.

  Just two problems I noticed:

[...]
> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> index f5fdaae..abc6ddd 100644
> --- a/libavformat/matroskaenc.c
> +++ b/libavformat/matroskaenc.c
> @@ -1136,7 +1136,9 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
>      AVIOContext *pb = s->pb;
>      AVCodecContext *codec = s->streams[pkt->stream_index]->codec;
>      int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY);
> -    int duration = pkt->duration;
> +    /* For backward compatibility, prefer convergence_duration. */
> +    int duration = pkt->convergence_duration > 0 ?
> +                   pkt->convergence_duration : pkt->duration;

  I think this should stay unchanged and instead...

>      int ret;
>      int64_t ts = mkv->tracks[pkt->stream_index].write_dts ? pkt->dts : pkt->pts;
>  
> @@ -1166,7 +1168,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, AVPacket *pkt)
>          duration = mkv_write_srt_blocks(s, pb, pkt);
>      } else {
>          ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, mkv_blockgroup_size(pkt->size));
> -        duration = pkt->convergence_duration;
> +        duration = pkt->duration;

  ...this should have the conditional as in the first hunk.

>          mkv_write_block(s, pb, MATROSKA_ID_BLOCK, pkt, 
>          put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration);
>          end_ebml_master(pb, blockgroup);
> diff --git a/libavformat/srtenc.c b/libavformat/srtenc.c
> index 171c45b..7c0119b 100644
> --- a/libavformat/srtenc.c
> +++ b/libavformat/srtenc.c
> @@ -64,7 +64,9 @@ static int srt_write_packet(AVFormatContext *avf, AVPacket *pkt)
>          int len;
>  
>          if (d <= 0)
> -            d = pkt->convergence_duration;
> +            /* For backward compatibility, prefer convergence_duration. */
> +            d = pkt->convergence_duration > 0 ?
> +                pkt->convergence_duration : pkt->duration;

  This should be wrong or at least redundant.

  AFAICT at that point d was already pkt->duration.

[...]

  Alexander


More information about the ffmpeg-devel mailing list